diff --git a/doc/contributions.txt b/doc/contributions.txt
index bb4d0b1f6e1768141f65773feb2265e9f9d07393..2dbd3783f26de76dddc997b9f48883b1c7c46a9f 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -192,6 +192,7 @@ Ansariel Hiller
 	MAINT-4677
 	MAINT-6300
 	MAINT-6397
+	MAINT-6432	
 Aralara Rajal
 Arare Chantilly
 	CHUIBUG-191
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 8a2e6a0bc0c807b1ded7f54857c35c7507128cb0..5ea9f5b6ccf714daf7aa597a6ca29c6ea98ca025 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -1575,6 +1575,7 @@ BOOL LLFloater::handleMouseDown(S32 x, S32 y, MASK mask)
 		if(offerClickToButton(x, y, mask, BUTTON_TEAR_OFF)) return TRUE;
 		if(offerClickToButton(x, y, mask, BUTTON_DOCK)) return TRUE;
 
+		setFrontmost(TRUE, FALSE);
 		// Otherwise pass to drag handle for movement
 		return mDragHandle->handleMouseDown(x, y, mask);
 	}
@@ -1649,7 +1650,7 @@ void LLFloater::setVisibleAndFrontmost(BOOL take_focus,const LLSD& key)
 	}
 }
 
-void LLFloater::setFrontmost(BOOL take_focus)
+void LLFloater::setFrontmost(BOOL take_focus, BOOL restore)
 {
 	LLMultiFloater* hostp = getHost();
 	if (hostp)
@@ -1665,7 +1666,7 @@ void LLFloater::setFrontmost(BOOL take_focus)
 		LLFloaterView * parent = dynamic_cast<LLFloaterView*>( getParent() );
 		if (parent)
 		{
-			parent->bringToFront(this, take_focus);
+			parent->bringToFront(this, take_focus, restore);
 		}
 
 		// Make sure to set the appropriate transparency type (STORM-732).
@@ -2394,7 +2395,7 @@ LLRect LLFloaterView::findNeighboringPosition( LLFloater* reference_floater, LLF
 }
 
 
-void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
+void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus, BOOL restore)
 {
 	if (!child)
 		return;
@@ -2478,7 +2479,12 @@ void LLFloaterView::bringToFront(LLFloater* child, BOOL give_focus)
 	{
 		sendChildToFront(child);
 	}
-	child->setMinimized(FALSE);
+
+	if(restore)
+	{
+		child->setMinimized(FALSE);
+	}
+
 	if (give_focus && !gFocusMgr.childHasKeyboardFocus(child))
 	{
 		child->setFocus(TRUE);
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index ef7c6180d25e579d5d828d60d9bae226cdad7cde..165f67499be11baeb175569e05c1c41e32599046 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -310,7 +310,7 @@ class LLFloater : public LLPanel, public LLInstanceTracker<LLFloater>
 	/*virtual*/ void setVisible(BOOL visible); // do not override
 	/*virtual*/ void onVisibilityChange ( BOOL new_visibility ); // do not override
 	
-	void			setFrontmost(BOOL take_focus = TRUE);
+	void			setFrontmost(BOOL take_focus = TRUE, BOOL restore = TRUE);
      virtual void	setVisibleAndFrontmost(BOOL take_focus=TRUE, const LLSD& key = LLSD());
 	
 	// Defaults to false.
@@ -547,7 +547,7 @@ class LLFloaterView : public LLUICtrl
 
 	void			setCycleMode(BOOL mode) { mFocusCycleMode = mode; }
 	BOOL			getCycleMode() const { return mFocusCycleMode; }
-	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE );
+	void			bringToFront( LLFloater* child, BOOL give_focus = TRUE, BOOL restore = TRUE );
 	void			highlightFocusedFloater();
 	void			unhighlightFocusedFloater();
 	void			focusFrontFloater();
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 8d863631cf1c1ac0b32373b7e78d4fbf911a82a8..dce0ea73cd4437701bda965955b3a1789cbb51b8 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1315,13 +1315,10 @@ set(viewer_HEADER_FILES
 
 source_group("CMake Rules" FILES ViewerInstall.cmake)
 
+#summary.json creation moved to viewer_manifest.py MAINT-6413
 # the viewer_version.txt file created here is for passing to viewer_manifest and autobuild
-# the summary.json file is created for the benefit of the TeamCity builds, where
-#   it is used to provide descriptive information to the build results page
 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt"
            "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\n")
-file(WRITE "${CMAKE_BINARY_DIR}/summary.json"
-           "{\"Type\":\"viewer\",\"Version\":\"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}\"}\n")
 
 set_source_files_properties(
    llversioninfo.cpp tests/llversioninfo_test.cpp 
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index be8ea2bab99ab85caceb1d4b8a0965b36f3cb7af..e99b94f150231d5dac83dbd1a468decffeeb7a37 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors 1   16
-RenderAvatarMaxComplexity          1	80000
+RenderAvatarMaxComplexity          1	350000
 RenderAvatarVP				1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index ca6c00951dbb9742dbbaa17964473374fc66efca..801a622e934751a7c080826e555c7b65861539db 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth			1	1
 RenderAvatarLODFactor		1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors 1   16
-RenderAvatarMaxComplexity          1	80000
+RenderAvatarMaxComplexity          1	350000
 RenderAvatarVP				1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index ea69b088f953e547b583a47f78ca6c77dd24a2a5..1f891ee4d7b0cb6a0054a8b891dc9f14ffcdb974 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -32,7 +32,7 @@ RenderAvatarCloth				1	1
 RenderAvatarLODFactor			1	1.0
 RenderAvatarPhysicsLODFactor 1	1.0
 RenderAvatarMaxNonImpostors     1   16
-RenderAvatarMaxComplexity              1	80000
+RenderAvatarMaxComplexity              1	350000
 RenderAvatarVP					1	1
 RenderAutoMuteSurfaceAreaLimit     1	1000.0
 RenderCubeMap				1	1
diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp
index 3e3d5c7456687d955ead55ef01e4a5aa207f576d..648212177b761b1311711066e42da28f953eb4dd 100644
--- a/indra/newview/llaisapi.cpp
+++ b/indra/newview/llaisapi.cpp
@@ -838,11 +838,11 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories)
 
 void AISUpdate::doUpdate()
 {
-	// Do version/descendent accounting.
+	// Do version/descendant accounting.
 	for (std::map<LLUUID,S32>::const_iterator catit = mCatDescendentDeltas.begin();
 		 catit != mCatDescendentDeltas.end(); ++catit)
 	{
-		LL_DEBUGS("Inventory") << "descendent accounting for " << catit->first << LL_ENDL;
+		LL_DEBUGS("Inventory") << "descendant accounting for " << catit->first << LL_ENDL;
 
 		const LLUUID cat_id(catit->first);
 		// Don't account for update if we just created this category.
@@ -859,13 +859,13 @@ void AISUpdate::doUpdate()
 			continue;
 		}
 
-		// If we have a known descendent count, set that now.
+		// If we have a known descendant count, set that now.
 		LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
 		if (cat)
 		{
 			S32 descendent_delta = catit->second;
 			S32 old_count = cat->getDescendentCount();
-			LL_DEBUGS("Inventory") << "Updating descendent count for "
+			LL_DEBUGS("Inventory") << "Updating descendant count for "
 								   << cat->getName() << " " << cat_id
 								   << " with delta " << descendent_delta << " from "
 								   << old_count << " to " << (old_count+descendent_delta) << LL_ENDL;
@@ -896,7 +896,7 @@ void AISUpdate::doUpdate()
 		LLUUID category_id(update_it->first);
 		LLPointer<LLViewerInventoryCategory> new_category = update_it->second;
 		// Since this is a copy of the category *before* the accounting update, above,
-		// we need to transfer back the updated version/descendent count.
+		// we need to transfer back the updated version/descendant count.
 		LLViewerInventoryCategory* curr_cat = gInventory.getCategory(new_category->getUUID());
 		if (!curr_cat)
 		{
@@ -961,7 +961,16 @@ void AISUpdate::doUpdate()
 		{
 			LL_WARNS() << "Possible version mismatch for category " << cat->getName()
 					<< ", viewer version " << cat->getVersion()
-					<< " server version " << version << LL_ENDL;
+					<< " AIS version " << version << " !!!Adjusting local version!!!" <<  LL_ENDL;
+
+            // the AIS version should be considered the true version. Adjust 
+            // our local category model to reflect this version number.  Otherwise 
+            // it becomes possible to get stuck with the viewer being out of 
+            // sync with the inventory system.  Under normal circumstances 
+            // inventory COF is maintained on the viewer through calls to 
+            // LLInventoryModel::accountForUpdate when a changing operation 
+            // is performed.  This occasionally gets out of sync however.
+            cat->setVersion(version);
 		}
 	}
 
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index cc676550abe65783b024ef45b9fd0f5155cc51bb..a1d97863210ef2ff418009298d6b30ddf317972e 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -60,6 +60,8 @@
 #include "llcoros.h"
 #include "lleventcoro.h"
 
+#include "llavatarpropertiesprocessor.h"
+
 #if LL_MSVC
 // disable boost::lexical_cast warning
 #pragma warning (disable:4702)
@@ -3359,15 +3361,9 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
 {
     if (!mOutstandingAppearanceBakeRequest)
     {
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
         mRerequestAppearanceBake = false;
         LLCoprocedureManager::CoProcedure_t proc = boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this, _1);
         LLCoprocedureManager::instance().enqueueCoprocedure("AIS", "LLAppearanceMgr::serverAppearanceUpdateCoro", proc);
-#else
-        LLCoros::instance().launch("serverAppearanceUpdateCoro", 
-            boost::bind(&LLAppearanceMgr::serverAppearanceUpdateCoro, this));
-
-#endif
     }
     else
     {
@@ -3375,17 +3371,8 @@ void LLAppearanceMgr::requestServerAppearanceUpdate()
     }
 }
 
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
 void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter)
-#else
-void LLAppearanceMgr::serverAppearanceUpdateCoro()
-#endif
 {
-#ifndef APPEARANCEBAKE_AS_IN_AIS_QUEUE
-    LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(
-        new LLCoreHttpUtil::HttpCoroutineAdapter("serverAppearanceUpdateCoro", LLCore::HttpRequest::DEFAULT_POLICY_ID));
-#endif
-
     mRerequestAppearanceBake = false;
     if (!gAgent.getRegion())
     {
@@ -3493,10 +3480,15 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro()
             // on multiple machines.
             if (result.has("expected"))
             {
-
                 S32 expectedCofVersion = result["expected"].asInteger();
                 LL_WARNS("Avatar") << "Server expected " << expectedCofVersion << " as COF version" << LL_ENDL;
 
+                // Force an update texture request for ourself.  The message will return
+                // through the UDP and be handled in LLVOAvatar::processAvatarAppearance
+                // this should ensure that we receive a new canonical COF from the sim
+                // host. Hopefully it will return before the timeout.
+                LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(gAgent.getID());
+
                 bRetry = true;
                 // Wait for a 1/2 second before trying again.  Just to keep from asking too quickly.
                 if (++retryCount > BAKE_RETRY_MAX_COUNT)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index bf181cb4add27777af9581ec8a2e0dd31ba76b4f..7069da735294761b697ba00e6c937f4389456f14 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -228,11 +228,7 @@ class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
 
 
 private:
-#ifdef APPEARANCEBAKE_AS_IN_AIS_QUEUE
     void serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t &httpAdapter);
-#else
-    void serverAppearanceUpdateCoro();
-#endif
 
     static void debugAppearanceUpdateCOF(const LLSD& content);
 
diff --git a/indra/newview/llavatarrendernotifier.cpp b/indra/newview/llavatarrendernotifier.cpp
index a13e142e161dcd45fdd60c599a7f2f7ab30d0d8a..24934fdb73c8008e910a60b7029816b3d43871db 100644
--- a/indra/newview/llavatarrendernotifier.cpp
+++ b/indra/newview/llavatarrendernotifier.cpp
@@ -63,7 +63,7 @@ mLatestAgentComplexity(0),
 mLatestOverLimitPct(0.0f),
 mShowOverLimitAgents(false),
 mNotifyOutfitLoading(false),
-mLastCofVersion(-1),
+mLastCofVersion(LLViewerInventoryCategory::VERSION_UNKNOWN),
 mLastOutfitRezStatus(-1),
 mLastSkeletonSerialNum(-1)
 {
@@ -207,8 +207,8 @@ void LLAvatarRenderNotifier::updateNotificationState()
         mLastSkeletonSerialNum = gAgentAvatarp->mLastSkeletonSerialNum;
     }
     else if (mLastCofVersion >= 0
-        && (mLastCofVersion != gAgentAvatarp->mLastUpdateRequestCOFVersion
-            || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
+        && (mLastCofVersion != LLAppearanceMgr::instance().getCOFVersion()
+        || mLastSkeletonSerialNum != gAgentAvatarp->mLastSkeletonSerialNum))
     {
         // version mismatch in comparison to previous outfit - outfit changed
         mNotifyOutfitLoading = true;
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index 7f1c981a3c71a949b1b473051d3c45d9f9073bef..d4ba230feb24e60ead6609a40c539e332fef5657 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -809,3 +809,62 @@ void LLFeatureManager::applyBaseMasks()
 		maskFeatures("safe");
 	}
 }
+
+LLSD LLFeatureManager::getRecommendedSettingsMap()
+{
+	// Create the map and fill it with the hardware recommended settings.
+	// It's needed to create an initial Default graphics preset (MAINT-6435).
+	// The process is similar to the one LLFeatureManager::applyRecommendedSettings() does.
+
+	LLSD map(LLSD::emptyMap());
+
+	loadGPUClass();
+	U32 level = llmax(GPU_CLASS_0, llmin(mGPUClass, GPU_CLASS_5));
+	LL_INFOS("RenderInit") << "Getting the map of recommended settings for level " << level << LL_ENDL;
+
+	applyBaseMasks();
+	std::string features(isValidGraphicsLevel(level) ? getNameForGraphicsLevel(level) : "Low");
+
+	maskFeatures(features);
+
+	LLControlVariable* ctrl = gSavedSettings.getControl("RenderQualityPerformance"); // include the quality value for correct preset loading   
+	map["RenderQualityPerformance"]["Value"] = (LLSD::Integer)level;
+	map["RenderQualityPerformance"]["Comment"] = ctrl->getComment();;
+	map["RenderQualityPerformance"]["Persist"] = 1;
+	map["RenderQualityPerformance"]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
+
+
+
+	for (feature_map_t::iterator mIt = mFeatures.begin(); mIt != mFeatures.end(); ++mIt)
+	{
+		LLControlVariable* ctrl = gSavedSettings.getControl(mIt->first);
+		if (ctrl == NULL)
+		{
+			LL_WARNS() << "AHHH! Control setting " << mIt->first << " does not exist!" << LL_ENDL;
+			continue;
+		}
+
+		if (ctrl->isType(TYPE_BOOLEAN))
+		{
+			map[mIt->first]["Value"] = (LLSD::Boolean)getRecommendedValue(mIt->first);
+		}
+		else if (ctrl->isType(TYPE_S32) || ctrl->isType(TYPE_U32))
+		{
+			map[mIt->first]["Value"] = (LLSD::Integer)getRecommendedValue(mIt->first);
+		}
+		else if (ctrl->isType(TYPE_F32))
+		{
+			map[mIt->first]["Value"] = (LLSD::Real)getRecommendedValue(mIt->first);
+		}
+		else
+		{
+			LL_WARNS() << "AHHH! Control variable is not a numeric type!" << LL_ENDL;
+			continue;
+		}
+		map[mIt->first]["Comment"] = ctrl->getComment();;
+		map[mIt->first]["Persist"] = 1;
+		map[mIt->first]["Type"] = LLControlGroup::typeEnumToString(ctrl->type());
+	}
+	
+	return map;
+}
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index 12ea691b491f0363ab19d6f62b98c1b69e253481..c3d87cea0bf8a7c0f3f42261ccbfc3b99200e895 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -157,7 +157,9 @@ class LLFeatureManager : public LLFeatureList, public LLSingleton<LLFeatureManag
 
 	// load the dynamic GPU/feature table from a website
 	void fetchHTTPTables();
-	
+
+	LLSD getRecommendedSettingsMap();
+
 protected:
 	bool loadGPUClass();
 
diff --git a/indra/newview/llfloaterdeleteprefpreset.cpp b/indra/newview/llfloaterdeleteprefpreset.cpp
index c0888db3bce4cfa2f3b549a9cd0bba3f820a59ac..7dedbbf98430169016ec275228f84c7bcdfae203 100644
--- a/indra/newview/llfloaterdeleteprefpreset.cpp
+++ b/indra/newview/llfloaterdeleteprefpreset.cpp
@@ -53,8 +53,6 @@ BOOL LLFloaterDeletePrefPreset::postBuild()
 	getChild<LLButton>("cancel")->setCommitCallback(boost::bind(&LLFloaterDeletePrefPreset::onBtnCancel, this));
 	LLPresetsManager::instance().setPresetListChangeCallback(boost::bind(&LLFloaterDeletePrefPreset::onPresetsListChange, this));
 
-	onPresetsListChange(); // ensure that delete button is disabled when the list is empty
-
 	return TRUE;
 }
 
diff --git a/indra/newview/llpresetsmanager.cpp b/indra/newview/llpresetsmanager.cpp
index d95546f11d211a3826cad348239710191f7c390c..9957039f728e326c8d88ccaa1709651e82eb1f30 100644
--- a/indra/newview/llpresetsmanager.cpp
+++ b/indra/newview/llpresetsmanager.cpp
@@ -38,6 +38,7 @@
 #include "llviewercontrol.h"
 #include "llfloaterpreference.h"
 #include "llfloaterreg.h"
+#include "llfeaturemanager.h"
 
 LLPresetsManager::LLPresetsManager()
 {
@@ -60,7 +61,7 @@ void LLPresetsManager::createMissingDefault()
 		LL_INFOS() << "No default preset found -- creating one at " << default_file << LL_ENDL;
 
 		// Write current graphic settings as the default
-		savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT);
+        savePreset(PRESETS_GRAPHIC, PRESETS_DEFAULT, true);
 	}
     else
     {
@@ -134,7 +135,7 @@ void LLPresetsManager::loadPresetNamesFromDir(const std::string& dir, preset_nam
 	presets = mPresetNames;
 }
 
-bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name)
+bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string name, bool createDefault)
 {
 	if (LLTrans::getString(PRESETS_DEFAULT) == name)
 	{
@@ -146,11 +147,10 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
 
 	if(PRESETS_GRAPHIC == subdirectory)
 	{
-		gSavedSettings.setString("PresetGraphicActive", name);
-
 		LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
-		if (instance)
+		if (instance && !createDefault)
 		{
+            gSavedSettings.setString("PresetGraphicActive", name);
 			instance->getControlNames(name_list);
             LL_DEBUGS() << "saving preset '" << name << "'; " << name_list.size() << " names" << LL_ENDL;
 			name_list.push_back("PresetGraphicActive");
@@ -170,23 +170,36 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
         LL_ERRS() << "Invalid presets directory '" << subdirectory << "'" << LL_ENDL;
     }
     
-    if (name_list.size() > 1) // if the active preset name is the only thing in the list, don't save the list
+    if (name_list.size() > 1 // if the active preset name is the only thing in the list, don't save the list
+        || (createDefault && name == PRESETS_DEFAULT && subdirectory == PRESETS_GRAPHIC)) // or create a default graphics preset from hw recommended settings 
     {
         // make an empty llsd
         LLSD paramsData(LLSD::emptyMap());
 
-        for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+        if (createDefault)
+        {
+            paramsData = LLFeatureManager::getInstance()->getRecommendedSettingsMap();
+            if (gSavedSettings.getU32("RenderAvatarMaxComplexity") == 0)
+            {
+                // use the recommended setting as an initial one (MAINT-6435)
+                gSavedSettings.setU32("RenderAvatarMaxComplexity", paramsData["RenderAvatarMaxComplexity"]["Value"].asInteger());
+            }
+        }
+        else
         {
-            std::string ctrl_name = *it;
-            LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
-            std::string comment = ctrl->getComment();
-            std::string type = LLControlGroup::typeEnumToString(ctrl->type());
-            LLSD value = ctrl->getValue();
-
-            paramsData[ctrl_name]["Comment"] =  comment;
-            paramsData[ctrl_name]["Persist"] = 1;
-            paramsData[ctrl_name]["Type"] = type;
-            paramsData[ctrl_name]["Value"] = value;
+            for (std::vector<std::string>::iterator it = name_list.begin(); it != name_list.end(); ++it)
+            {
+                std::string ctrl_name = *it;
+                LLControlVariable* ctrl = gSavedSettings.getControl(ctrl_name).get();
+                std::string comment = ctrl->getComment();
+                std::string type = LLControlGroup::typeEnumToString(ctrl->type());
+                LLSD value = ctrl->getValue();
+
+                paramsData[ctrl_name]["Comment"] = comment;
+                paramsData[ctrl_name]["Persist"] = 1;
+                paramsData[ctrl_name]["Type"] = type;
+                paramsData[ctrl_name]["Value"] = value;
+            }
         }
 
         std::string pathName(getPresetsDir(subdirectory) + gDirUtilp->getDirDelimiter() + LLURI::escape(name) + ".xml");
@@ -203,10 +216,12 @@ bool LLPresetsManager::savePreset(const std::string& subdirectory, std::string n
             
             LL_DEBUGS() << "saved preset '" << name << "'; " << paramsData.size() << " parameters" << LL_ENDL;
 
-            gSavedSettings.setString("PresetGraphicActive", name);
-
-            // signal interested parties
-            triggerChangeSignal();
+            if (!createDefault)
+            {
+                gSavedSettings.setString("PresetGraphicActive", name);
+                // signal interested parties
+                triggerChangeSignal();
+            }
         }
         else
         {
diff --git a/indra/newview/llpresetsmanager.h b/indra/newview/llpresetsmanager.h
index ac4f0c010ce31cfc0862682a33549836288e66a8..21f9885f2786c9d4ec95c0db2462a62488982e50 100644
--- a/indra/newview/llpresetsmanager.h
+++ b/indra/newview/llpresetsmanager.h
@@ -56,7 +56,7 @@ class LLPresetsManager : public LLSingleton<LLPresetsManager>
 	static std::string getPresetsDir(const std::string& subdirectory);
 	void setPresetNamesInComboBox(const std::string& subdirectory, LLComboBox* combo, EDefaultOptions default_option);
 	void loadPresetNamesFromDir(const std::string& dir, preset_name_list_t& presets, EDefaultOptions default_option);
-	bool savePreset(const std::string& subdirectory, std::string name);
+	bool savePreset(const std::string& subdirectory, std::string name, bool createDefault = false);
 	void loadPreset(const std::string& subdirectory, std::string name);
 	bool deletePreset(const std::string& subdirectory, std::string name);
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index b9dd43f0617aa7b0345362b8d25e5fc2684b0d95..cdc7e20c2c968789166ac505c606908a00e0d3cb 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -7313,7 +7313,6 @@ bool resolve_appearance_version(const LLAppearanceMessageContents& contents, S32
 //-----------------------------------------------------------------------------
 void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 {
-    static S32 largestSelfCOFSeen(LLViewerInventoryCategory::VERSION_UNKNOWN);
 	LL_DEBUGS("Avatar") << "starts" << LL_ENDL;
 	
 	bool enable_verbose_dumps = gSavedSettings.getBOOL("DebugAvatarAppearanceMessage");
@@ -7348,43 +7347,34 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		return;
 	}
 
-	S32 this_update_cof_version = contents.mCOFVersion;
-	S32 last_update_request_cof_version = mLastUpdateRequestCOFVersion;
+    S32 thisAppearanceVersion(contents.mCOFVersion);
+    if (isSelf())
+    {   // In the past this was considered to be the canonical COF version, 
+        // that is no longer the case.  The canonical version is maintained 
+        // by the AIS code and should match the COF version there. Even so,
+        // we must prevent rolling this one backwards backwards or processing 
+        // stale versions.
 
-	if( isSelf() )
-	{
-		LL_DEBUGS("Avatar") << "this_update_cof_version " << this_update_cof_version
-				<< " last_update_request_cof_version " << last_update_request_cof_version
-				<<  " my_cof_version " << LLAppearanceMgr::instance().getCOFVersion() << LL_ENDL;
+        S32 aisCOFVersion(LLAppearanceMgr::instance().getCOFVersion());
+
+        LL_DEBUGS("Avatar") << "handling self appearance message #" << thisAppearanceVersion <<
+            " (highest seen #" << mLastUpdateReceivedCOFVersion <<
+            ") (AISCOF=#" << aisCOFVersion << ")" << LL_ENDL;
 
-        if (largestSelfCOFSeen > this_update_cof_version)
+        if (mLastUpdateReceivedCOFVersion >= thisAppearanceVersion)
         {
-            LL_WARNS("Avatar") << "Already processed appearance for COF version " <<
-                largestSelfCOFSeen << ", discarding appearance with COF " << this_update_cof_version << LL_ENDL;
+            LL_WARNS("Avatar") << "Stale appearance received #" << thisAppearanceVersion <<
+                " attempt to roll back from #" << mLastUpdateReceivedCOFVersion <<
+                "... dropping." << LL_ENDL;
+            return;
+        }
+        if (isEditingAppearance())
+        {
+            LL_DEBUGS("Avatar") << "Editing appearance.  Dropping appearance update." << LL_ENDL;
             return;
         }
-        largestSelfCOFSeen = this_update_cof_version;
-
-	}
-	else
-	{
-		LL_DEBUGS("Avatar") << "appearance message received" << LL_ENDL;
-	}
-
-	// Check for stale update.
-	if (isSelf()
-		&& (this_update_cof_version < last_update_request_cof_version))
-	{
-		LL_WARNS() << "Stale appearance update, wanted version " << last_update_request_cof_version
-				<< ", got " << this_update_cof_version << LL_ENDL;
-		return;
-	}
 
-	if (isSelf() && isEditingAppearance())
-	{
-		LL_DEBUGS("Avatar") << "ignoring appearance message while in appearance edit" << LL_ENDL;
-		return;
-	}
+    }
 
 	// SUNSHINE CLEANUP - is this case OK now?
 	S32 num_params = contents.mParamWeights.size();
@@ -7399,13 +7389,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 	}
 
 	// No backsies zone - if we get here, the message should be valid and usable, will be processed.
-    LL_INFOS("Avatar") << "Processing appearance message version " << this_update_cof_version << LL_ENDL;
+    LL_INFOS("Avatar") << "Processing appearance message version " << thisAppearanceVersion << LL_ENDL;
 
-	// Note:
-	// RequestAgentUpdateAppearanceResponder::onRequestRequested()
-	// assumes that cof version is only updated with server-bake
-	// appearance messages.
-	mLastUpdateReceivedCOFVersion = this_update_cof_version;
+    if (isSelf())
+    {
+        // Note:
+        // locally the COF is maintained via LLInventoryModel::accountForUpdate
+        // which is called from various places.  This should match the simhost's 
+        // idea of what the COF version is.  AIS however maintains its own version
+        // of the COF that should be considered canonical. 
+        mLastUpdateReceivedCOFVersion = thisAppearanceVersion;
+    }
 		
     if (applyParsedTEMessage(contents.mTEContents) > 0 && isChanged(TEXTURE))
     {
@@ -7528,7 +7522,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
 		// Got an update for some other avatar
 		// Ignore updates for self, because we have a more authoritative value in the preferences.
 		setHoverOffset(contents.mHoverOffset);
-		LL_INFOS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
+		LL_DEBUGS("Avatar") << avString() << "setting hover to " << contents.mHoverOffset[2] << LL_ENDL;
 	}
 
 	if (!contents.mHoverOffsetWasSet && !isSelf())
@@ -8151,6 +8145,7 @@ U32 LLVOAvatar::getPartitionType() const
 //static
 void LLVOAvatar::updateImpostors()
 {
+	LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
 	LLCharacter::sAllowInstancesChange = FALSE;
 
 	for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 1c77cf805e94c362ecd917ecaf217a13f2b13c32..f3d89bb8660388fe5a7b12821a976086631bf181 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -30,6 +30,7 @@
 import os.path
 import shutil
 import errno
+import json
 import re
 import tarfile
 import time
@@ -181,9 +182,16 @@ def construct(self):
                 self.path("*.tga")
                 self.end_prefix("local_assets")
 
-            # Files in the newview/ directory
+            # File in the newview/ directory
             self.path("gpu_table.txt")
-            # The summary.json file gets left in the build directory by newview/CMakeLists.txt.
+
+            #summary.json.  Standard with exception handling is fine.  If we can't open a new file for writing, we have worse problems
+            summary_dict = {"Type":"viewer","Version":'.'.join(self.args['version']),"Channel":self.channel_with_pkg_suffix()}
+            with open(os.path.join(os.pardir,'summary.json'), 'w') as summary_handle:
+                json.dump(summary_dict,summary_handle)
+
+            #we likely no longer need the test, since we will throw an exception above, but belt and suspenders and we get the
+            #return code for free.
             if not self.path2basename(os.pardir, "summary.json"):
                 print "No summary.json file"