diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp
index b4299fc2f5ab0d1cdc031f028a8ae2e41cbed6a6..c2b390d2eb4376a59c30c4f15b40e9b2845dab5d 100644
--- a/indra/llappearance/llavatarappearance.cpp
+++ b/indra/llappearance/llavatarappearance.cpp
@@ -1049,7 +1049,6 @@ BOOL LLAvatarAppearance::loadSkeletonNode ()
 	mRoot->addChild(mMeshLOD[MESH_ID_UPPER_BODY]);
 	mRoot->addChild(mMeshLOD[MESH_ID_LOWER_BODY]);
 	mRoot->addChild(mMeshLOD[MESH_ID_SKIRT]);
-	mRoot->addChild(mMeshLOD[MESH_ID_HEAD]);
 
 	LLAvatarJoint *skull = (LLAvatarJoint*)mRoot->findJoint("mSkull");
 	if (skull)
diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp
index 570f7be3948e2e70caf125870725edb3fc7016e4..cb4de1af3a67258c5ba2b41391bebcf626dae439 100644
--- a/indra/llinventory/llsettingssky.cpp
+++ b/indra/llinventory/llsettingssky.cpp
@@ -133,7 +133,7 @@ const std::string LLSettingsSky::SETTING_SKY_ICE_LEVEL("ice_level");
 
 const std::string LLSettingsSky::SETTING_REFLECTION_PROBE_AMBIANCE("reflection_probe_ambiance");
 
-const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("3ae23978-ac82-bcf3-a9cb-ba6e52dcb9ad");
+const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("651510b8-5f4d-8991-1592-e7eeab2a5a06");
 
 static const LLUUID DEFAULT_SUN_ID("32bfbcea-24b1-fb9d-1ef9-48a28a63730f"); // dataserver
 static const LLUUID DEFAULT_MOON_ID("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 611b0bee49db39b47915bf76b7784ec0869ba8c0..fe28a314ac6609b7af13d0bcdfc74562b0148c2a 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10136,7 +10136,7 @@
     <key>Type</key>
     <string>F32</string>
     <key>Value</key>
-    <real>-0.001</real>
+    <real>-0.0002</real>
   </map>
   <key>RenderSpotShadowOffset</key>
   <map>
@@ -12019,6 +12019,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+  <key>SelectReflectionProbes</key>
+    <map>
+      <key>Comment</key>
+      <string>Select reflection probes</string>
+      <key>Persist</key>
+      <integer>0</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>0</integer>
+    </map>
     <key>SelectOwnedOnly</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 5c1cb9e159714f0ae9dd1b153e7319034726b985..5381664e4fbf6bd991c90c85cebe27cf4d78dc3f 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -168,8 +168,8 @@ void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
 	is_deferred_render = true;
 	
 	if (LLPipeline::sImpostorRender)
-	{ //impostor pass does not have rigid or impostor rendering
-		pass += 2;
+	{ //impostor pass does not have impostor rendering
+		++pass;
 	}
 
 	switch (pass)
@@ -195,7 +195,7 @@ void LLDrawPoolAvatar::endDeferredPass(S32 pass)
 
 	if (LLPipeline::sImpostorRender)
 	{
-		pass += 2;
+		++pass;
 	}
 
 	switch (pass)
@@ -415,7 +415,7 @@ void LLDrawPoolAvatar::render(S32 pass)
     LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
 	if (LLPipeline::sImpostorRender)
 	{
-		renderAvatars(NULL, pass+2);
+		renderAvatars(NULL, ++pass);
 		return;
 	}
 
@@ -430,7 +430,7 @@ void LLDrawPoolAvatar::beginRenderPass(S32 pass)
 
 	if (LLPipeline::sImpostorRender)
 	{ //impostor render does not have impostors or rigid rendering
-		pass += 2;
+		++pass;
 	}
 
 	switch (pass)
@@ -458,7 +458,7 @@ void LLDrawPoolAvatar::endRenderPass(S32 pass)
 
 	if (LLPipeline::sImpostorRender)
 	{
-		pass += 2;		
+		++pass;
 	}
 
 	switch (pass)
diff --git a/indra/newview/llfloatertexturepicker.cpp b/indra/newview/llfloatertexturepicker.cpp
index bcf6c80749a59a24da5e159223c0311c4eafb1f2..eee705907215c4b48efe0ba53b6e8e915e9646c4 100644
--- a/indra/newview/llfloatertexturepicker.cpp
+++ b/indra/newview/llfloatertexturepicker.cpp
@@ -147,12 +147,20 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
 				mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
 			}
 		}
-		
-
-		
 	}
 }
 
+void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection)
+{
+    LLUUID asset_id = itemp->getAssetUUID();
+    if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+    {
+        // If an inventory item has a null asset, consider it a valid blank material(gltf)
+        asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+    }
+    setImageID(asset_id, set_selection);
+}
+
 void LLFloaterTexturePicker::setActive( BOOL active )					
 {
 	if (!active && getChild<LLUICtrl>("Pipette")->getValue().asBoolean())
@@ -303,7 +311,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
 		{
 			if (drop)
 			{
-				setImageID( item->getAssetUUID() );
+                setImageIDFromItem(item);
 				commitIfImmediateSet();
 			}
 
@@ -492,6 +500,7 @@ void LLFloaterTexturePicker::draw()
             if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL)
             {
                 mGLTFMaterial = (LLFetchedGLTFMaterial*) gGLTFMaterialList.getMaterial(mImageAssetID);
+                llassert(mGLTFMaterial == nullptr || dynamic_cast<LLFetchedGLTFMaterial*>(gGLTFMaterialList.getMaterial(mImageAssetID)) != nullptr);
             }
             else
             {
@@ -604,6 +613,11 @@ void LLFloaterTexturePicker::draw()
 
 const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library)
 {
+	if (asset_id.isNull())
+	{
+		return LLUUID::null;
+	}
+
 	LLViewerInventoryCategory::cat_array_t cats;
 	LLViewerInventoryItem::item_array_t items;
 	LLAssetIDMatches asset_id_matches(asset_id);
@@ -800,7 +814,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
 			{
 				mNoCopyTextureSelected = TRUE;
 			}
-			setImageID(itemp->getAssetUUID(),false);
+            setImageIDFromItem(itemp, false);
 			mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
 
 			if(!mPreviewSettingChanged)
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 8bbff470e01382918fbb711375d4fd97c7ea6c0f..b102b5acde73969a78a9baad0d6e0728f5442ef5 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -964,7 +964,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 		BOOL editable = objectp->permModify() && !objectp->isPermanentEnforced();
 
         bool has_pbr_material;
-        updateUIGLTF(objectp, has_pbr_material, force_set_values);
+        bool has_faces_without_pbr;
+        updateUIGLTF(objectp, has_pbr_material, has_faces_without_pbr, force_set_values);
 
         const bool has_material = !has_pbr_material;
 
@@ -1489,7 +1490,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 			getChild<LLUICtrl>("checkbox fullbright")->setValue((S32)(fullbright_flag != 0));
 			getChildView("checkbox fullbright")->setEnabled(editable && !has_pbr_material);
 			getChild<LLUICtrl>("checkbox fullbright")->setTentative(!identical_fullbright);
-            getChild<LLComboBox>("combobox matmedia")->setEnabledByValue("Materials", !has_pbr_material);
+            mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material);
 		}
 		
 		// Repeats per meter
@@ -1746,7 +1747,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
 	}
 }
 
-void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool force_set_values)
+void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool& has_faces_without_pbr, bool force_set_values)
 {
     has_pbr_material = false;
 
@@ -1759,9 +1760,7 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
     {
         LLUUID pbr_id;
         bool identical_pbr;
-        LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr);
-
-        has_pbr_material = pbr_id.notNull();
+        LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr, has_pbr_material, has_faces_without_pbr);
 
         pbr_ctrl->setTentative(identical_pbr ? FALSE : TRUE);
         pbr_ctrl->setEnabled(editable && has_pbr_capabilities);
@@ -1769,13 +1768,13 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
     }
 
     getChildView("pbr_from_inventory")->setEnabled(editable && has_pbr_capabilities);
-    getChildView("edit_selected_pbr")->setEnabled(editable && has_pbr_material && has_pbr_capabilities);
-    getChildView("save_selected_pbr")->setEnabled(objectp->permCopy() && has_pbr_material && has_pbr_capabilities);
+    getChildView("edit_selected_pbr")->setEnabled(editable && has_pbr_material && !has_faces_without_pbr && has_pbr_capabilities);
+    getChildView("save_selected_pbr")->setEnabled(objectp->permCopy() && has_pbr_material && !has_faces_without_pbr && has_pbr_capabilities);
 
     const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
     if (show_pbr)
     {
-        const bool new_state = has_pbr_capabilities && has_pbr_material;
+        const bool new_state = has_pbr_capabilities && has_pbr_material && !has_faces_without_pbr;
 
         LLUICtrl* gltfCtrlTextureScaleU = getChild<LLUICtrl>("gltfTextureScaleU");
         LLUICtrl* gltfCtrlTextureScaleV = getChild<LLUICtrl>("gltfTextureScaleV");
@@ -4964,16 +4963,34 @@ void LLPanelFace::LLSelectedTE::getTexId(LLUUID& id, bool& identical)
 	identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, id );
 }
 
-void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical)
+void LLPanelFace::LLSelectedTE::getPbrMaterialId(LLUUID& id, bool& identical, bool& has_faces_with_pbr, bool& has_faces_without_pbr)
 {
     struct LLSelectedTEGetmatId : public LLSelectedTEGetFunctor<LLUUID>
     {
+        LLSelectedTEGetmatId()
+            : mHasFacesWithoutPBR(false)
+            , mHasFacesWithPBR(false)
+        {
+        }
         LLUUID get(LLViewerObject* object, S32 te_index)
         {
-            return object->getRenderMaterialID(te_index);
+            LLUUID pbr_id = object->getRenderMaterialID(te_index);
+            if (pbr_id.isNull())
+            {
+                mHasFacesWithoutPBR = true;
+            }
+            else
+            {
+                mHasFacesWithPBR = true;
+            }
+            return pbr_id;
         }
+        bool mHasFacesWithoutPBR;
+        bool mHasFacesWithPBR;
     } func;
     identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue(&func, id);
+    has_faces_with_pbr = func.mHasFacesWithPBR;
+    has_faces_without_pbr = func.mHasFacesWithoutPBR;
 }
 
 void LLPanelFace::LLSelectedTEMaterial::getCurrent(LLMaterialPtr& material_ptr, bool& identical_material)
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index b6d77b237416c84b393695b9e1226af1df478fd4..eaf82a26be01ca3b9216b11f17de2ff936bdf93a 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -476,7 +476,7 @@ class LLPanelFace : public LLPanel
     void onTextureSelectionChanged(LLInventoryItem* itemp);
     void onPbrSelectionChanged(LLInventoryItem* itemp);
 
-    void updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool force_set_values);
+    void updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material, bool& has_faces_without_pbr, bool force_set_values);
     void updateVisibilityGLTF();
 
     void updateSelectedGLTFMaterials(std::function<void(LLGLTFMaterial*)> func);
@@ -619,7 +619,7 @@ class LLPanelFace : public LLPanel
 		static void getFace(class LLFace*& face_to_return, bool& identical_face);
 		static void getImageFormat(LLGLenum& image_format_to_return, bool& identical_face);
 		static void getTexId(LLUUID& id, bool& identical);
-        static void getPbrMaterialId(LLUUID& id, bool& identical);
+        static void getPbrMaterialId(LLUUID& id, bool& identical, bool& has_pbr, bool& has_faces_without_pbr);
 		static void getObjectScaleS(F32& scale_s, bool& identical);
 		static void getObjectScaleT(F32& scale_t, bool& identical);
 		static void getMaxDiffuseRepeats(F32& repeats, bool& identical);
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index f9752c337c6526b61f41fa746e71629a6ee5a68c..d57279a7240a18e6a5a7428042ec5542f5340ccd 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3638,7 +3638,9 @@ class LLOctreeIntersect : public LLOctreeTraveler<LLViewerOctreeEntry, LLPointer
 					}
 				}
 
-				if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, mPickTransparent, mPickRigged, mPickUnselectable, mFaceHit, &intersection, mTexCoord, mNormal, mTangent))
+				if (!skip_check && vobj->lineSegmentIntersect(mStart, mEnd, -1, 
+                    (mPickReflectionProbe && vobj->isReflectionProbe()) ? TRUE : mPickTransparent, // always pick transparent when picking selection probe
+                    mPickRigged, mPickUnselectable, mFaceHit, &intersection, mTexCoord, mNormal, mTangent))
 				{
 					mEnd = intersection;  // shorten ray so we only find CLOSER hits
 					if (mIntersection)
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index b2ad2bf55b022995269f12475ec28cede80dfcb1..7b77d4a0791cee2acd966bbcd6373c4510be277e 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -222,12 +222,20 @@ void LLFloaterTexturePicker::setImageID(const LLUUID& image_id, bool set_selecti
 				mInventoryPanel->setSelection(item_id, TAKE_FOCUS_NO);
 			}
 		}
-		
-
-		
 	}
 }
 
+void LLFloaterTexturePicker::setImageIDFromItem(const LLInventoryItem* itemp, bool set_selection)
+{
+    LLUUID asset_id = itemp->getAssetUUID();
+    if (mInventoryPickType == LLTextureCtrl::PICK_MATERIAL && asset_id.isNull())
+    {
+        // If an inventory item has a null asset, consider it a valid blank material(gltf)
+        asset_id = LLGLTFMaterialList::BLANK_MATERIAL_ASSET_ID;
+    }
+    setImageID(asset_id, set_selection);
+}
+
 void LLFloaterTexturePicker::setActive( BOOL active )					
 {
 	if (!active && getChild<LLUICtrl>("Pipette")->getValue().asBoolean())
@@ -378,7 +386,7 @@ BOOL LLFloaterTexturePicker::handleDragAndDrop(
 		{
 			if (drop)
 			{
-				setImageID( item->getAssetUUID() );
+                setImageIDFromItem(item);
 				commitIfImmediateSet();
 			}
 
@@ -675,6 +683,11 @@ void LLFloaterTexturePicker::draw()
 
 const LLUUID& LLFloaterTexturePicker::findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library)
 {
+	if (asset_id.isNull())
+	{
+		return LLUUID::null;
+	}
+
 	LLViewerInventoryCategory::cat_array_t cats;
 	LLViewerInventoryItem::item_array_t items;
 	LLAssetIDMatches asset_id_matches(asset_id);
@@ -850,7 +863,7 @@ void LLFloaterTexturePicker::onSelectionChange(const std::deque<LLFolderViewItem
 			{
 				mNoCopyTextureSelected = TRUE;
 			}
-			setImageID(itemp->getAssetUUID(),false);
+            setImageIDFromItem(itemp, false);
 			mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here?
 
 			if(!mPreviewSettingChanged)
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index 13c36e1926bd06c046f654bc1c3b600d5420a39d..aae0e812af17abc600eb51fe81b0816307a622bb 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -268,7 +268,8 @@ BOOL LLToolCompTranslate::handleHover(S32 x, S32 y, MASK mask)
 BOOL LLToolCompTranslate::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	mMouseDown = TRUE;
-	gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, LLFloaterReg::instanceVisible("build"));
+    gViewerWindow->pickAsync(x, y, mask, pickCallback, /*BOOL pick_transparent*/ FALSE, LLFloaterReg::instanceVisible("build"), FALSE,
+        gSavedSettings.getBOOL("SelectReflectionProbes"));;
 	return TRUE;
 }
 
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index 67fec63b786c75348a99c8a0272e49ba1ad8ae46..f7187c58a216aea8feb730b2192f5ab660251555 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -71,7 +71,9 @@ BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask)
 	// do immediate pick query
     BOOL pick_rigged = false; //gSavedSettings.getBOOL("AnimatedObjectsAllowLeftClick");
     BOOL pick_transparent = gSavedSettings.getBOOL("SelectInvisibleObjects");
-	mPick = gViewerWindow->pickImmediate(x, y, pick_transparent, pick_rigged);
+    BOOL pick_reflection_probe = gSavedSettings.getBOOL("SelectReflectionProbes");
+
+	mPick = gViewerWindow->pickImmediate(x, y, pick_transparent, pick_rigged, FALSE, TRUE, pick_reflection_probe);
 
 	// Pass mousedown to agent
 	LLTool::handleMouseDown(x, y, mask);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index cf51be6b4393806e21f3181d2b1d13e16fdf6896..9d862e7ac6ab7a8c715e76a04887e825dc5d38a5 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2915,7 +2915,12 @@ bool enable_object_inspect()
 
 struct LLSelectedTEGetmatIdAndPermissions : public LLSelectedTEFunctor
 {
-    LLSelectedTEGetmatIdAndPermissions() : mCanCopy(true), mCanModify(true), mCanTransfer(true) {}
+    LLSelectedTEGetmatIdAndPermissions()
+        : mCanCopy(true)
+        , mCanModify(true)
+        , mCanTransfer(true)
+        , mHasNonPbrFaces(false)
+    {}
     bool apply(LLViewerObject* objectp, S32 te_index)
     {
         mCanCopy &= (bool)objectp->permCopy();
@@ -2926,11 +2931,16 @@ struct LLSelectedTEGetmatIdAndPermissions : public LLSelectedTEFunctor
         {
             mMaterialId = mat_id;
         }
+        else
+        {
+            mHasNonPbrFaces = true;
+        }
         return true;
     }
     bool mCanCopy;
     bool mCanModify;
     bool mCanTransfer;
+    bool mHasNonPbrFaces;
     LLUUID mMaterialId;
 };
 
@@ -2943,7 +2953,7 @@ bool enable_object_edit_gltf_material()
 
     LLSelectedTEGetmatIdAndPermissions func;
     LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func);
-    return func.mCanModify && func.mMaterialId.notNull();
+    return func.mCanModify && !func.mHasNonPbrFaces;
 }
 
 bool enable_object_open()
@@ -8451,6 +8461,18 @@ class LLToolsSelectInvisibleObjects : public view_listener_t
     }
 };
 
+class LLToolsSelectReflectionProbes: public view_listener_t
+{
+    bool handleEvent(const LLSD& userdata)
+    {
+        BOOL cur_val = gSavedSettings.getBOOL("SelectReflectionProbes");
+
+        gSavedSettings.setBOOL("SelectReflectionProbes", !cur_val);
+
+        return true;
+    }
+};
+
 class LLToolsSelectBySurrounding : public view_listener_t
 {
 	bool handleEvent(const LLSD& userdata)
@@ -9743,6 +9765,7 @@ void initialize_menus()
 	view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
 	view_listener_t::addMenu(new LLToolsSelectOnlyMovableObjects(), "Tools.SelectOnlyMovableObjects");
     view_listener_t::addMenu(new LLToolsSelectInvisibleObjects(), "Tools.SelectInvisibleObjects");
+    view_listener_t::addMenu(new LLToolsSelectReflectionProbes(), "Tools.SelectReflectionProbes");
 	view_listener_t::addMenu(new LLToolsSelectBySurrounding(), "Tools.SelectBySurrounding");
 	view_listener_t::addMenu(new LLToolsShowHiddenSelection(), "Tools.ShowHiddenSelection");
 	view_listener_t::addMenu(new LLToolsShowSelectionLightRadius(), "Tools.ShowSelectionLightRadius");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index c9cf897cf82dd4f20432b61512a9ef52fd6aea0c..0925451583b9e89c8eb951b4ae9e943bcbf88291 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1547,7 +1547,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam
 						LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);
 						break;
                     case LLAssetType::AT_MATERIAL:
-                        LLFloaterReg::showInstance("material_editor", LLSD(obj_id), take_focus);
+                        // Explicitly do nothing -- we don't want to open the material editor every time you add a material to inventory
                         break;
 					default:
 						LL_DEBUGS("Messaging") << "No preview method for previewable asset type : " << LLAssetType::lookupHumanReadable(asset_type)  << LL_ENDL;
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index d362f52db6af617b3939ecc5678bd7ff8ea0a517..1f9a54668a755b3667fbc85a5886bbaab620e197 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -627,13 +627,17 @@ void LLViewerOctreeGroup::handleRemoval(const TreeNode* node, LLViewerOctreeEntr
 //virtual 
 void LLViewerOctreeGroup::handleDestruction(const TreeNode* node)
 {
+    if (isDead())
+    {
+        return;
+    }
+    setState(DEAD);
 	for (OctreeNode::element_iter i = mOctreeNode->getDataBegin(), i_end = mOctreeNode->getDataEnd(); i != i_end; ++i)
 	{
 		LLViewerOctreeEntry* obj = *i;
 		if (obj && obj->getGroup() == this)
 		{
 			obj->nullGroup();
-			//obj->setGroup(NULL);
 		}
 	}
 	mOctreeNode = NULL;
@@ -724,8 +728,7 @@ bool LLViewerOctreeGroup::boundObjects(BOOL empty, LLVector4a& minOut, LLVector4
 		newMin = minMax[0];
 		newMax = minMax[1];
 
-		OctreeNode::const_element_iter i_end = node->getDataEnd();
-		for (++i; i != i_end; ++i)
+		for (++i; i != node->getDataEnd(); ++i)
 		{
 			entry = *i;
 			minMax = entry->getSpatialExtents();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index d974681761c1e715626e48a28eac4da4282ff8d8..abbbb2cbfdba5f499d22c3ee79baf3999b9bd346 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -4301,7 +4301,8 @@ void LLViewerWindow::pickAsync( S32 x,
 								void (*callback)(const LLPickInfo& info),
 								BOOL pick_transparent,
 								BOOL pick_rigged,
-								BOOL pick_unselectable)
+								BOOL pick_unselectable,
+                                BOOL pick_reflection_probes)
 {
 	// "Show Debug Alpha" means no object actually transparent
     BOOL in_build_mode = LLFloaterReg::instanceVisible("build");
@@ -4311,7 +4312,7 @@ void LLViewerWindow::pickAsync( S32 x,
         pick_transparent = TRUE;
     }
 
-	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, TRUE, pick_unselectable, TRUE, callback);
+	LLPickInfo pick_info(LLCoordGL(x, y_from_bot), mask, pick_transparent, pick_rigged, FALSE, pick_reflection_probes, pick_unselectable, TRUE, callback);
 	schedulePick(pick_info);
 }
 
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index 622e09f5badd19ab9d1978877170e486a686d2a8..d1ea7172cca5cab2755dd711a7202cd361c4518a 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -405,8 +405,9 @@ class LLViewerWindow final : public LLWindowCallbacks
 								void (*callback)(const LLPickInfo& pick_info),
 								BOOL pick_transparent = FALSE,
 								BOOL pick_rigged = FALSE,
-								BOOL pick_unselectable = FALSE);
-	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_rigged = FALSE, BOOL pick_particle = FALSE, BOOL pick_unselectable = TRUE, BOOL pick_reflection_probe = TRUE);
+								BOOL pick_unselectable = FALSE,
+                                BOOL pick_reflection_probes = FALSE);
+	LLPickInfo		pickImmediate(S32 x, S32 y, BOOL pick_transparent, BOOL pick_rigged = FALSE, BOOL pick_particle = FALSE, BOOL pick_unselectable = TRUE, BOOL pick_reflection_probe = FALSE);
 	LLHUDIcon* cursorIntersectIcon(S32 mouse_x, S32 mouse_y, F32 depth,
 										   LLVector4a* intersection);
 
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1fad7d8ec2cd5d5e2930579914e451ddd2caa0ad..56f8967c3c5b2f0f8ccca0d6bc98a042127e3a5f 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -5432,11 +5432,6 @@ U32 LLVOAvatar::renderRigid()
 	{
 		return 0;
 	}
-	
-	if (!mIsBuilt)
-	{
-		return 0;
-	}
 
 	if (isTextureVisible(TEX_EYES_BAKED) || (getOverallAppearance() == AOA_JELLYDOLL && !isControlAvatar()) || isUIAvatar())
 	{
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 92af626c313b98062d79672435ae00f1fca94a88..554f3b72f769173e236354f9a5b52880c0fe74a8 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2621,8 +2621,11 @@ void LLPipeline::doOcclusion(LLCamera& camera)
 		for (LLCullResult::sg_iterator iter = sCull->beginOcclusionGroups(); iter != sCull->endOcclusionGroups(); ++iter)
 		{
 			LLSpatialGroup* group = *iter;
-			group->doOcclusion(&camera);
-			group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
+            if (!group->isDead())
+            {
+                group->doOcclusion(&camera);
+                group->clearOcclusionState(LLSpatialGroup::ACTIVE_OCCLUSION);
+            }
 		}
 	
 		//apply occlusion culling to object cache tree
@@ -3051,6 +3054,10 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
 	for (LLCullResult::sg_iterator iter = sCull->beginDrawableGroups(), iter_end = sCull->endDrawableGroups(); iter != iter_end; ++iter)
 	{
 		LLSpatialGroup* group = *iter;
+        if (group->isDead())
+        {
+            continue;
+        }
 		group->checkOcclusion();
 		if (sUseOcclusion > 1 && group->isOcclusionState(LLSpatialGroup::OCCLUDED))
 		{
@@ -3110,6 +3117,10 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
 	for (LLCullResult::sg_iterator iter = sCull->beginVisibleGroups(), iter_end = sCull->endVisibleGroups(); iter != iter_end; ++iter)
 	{
 		LLSpatialGroup* group = *iter;
+        if (group->isDead())
+        {
+            continue;
+        }
 		group->checkOcclusion();
 		if (sUseOcclusion > 1 && group->isOcclusionState(LLSpatialGroup::OCCLUDED))
 		{
@@ -3271,7 +3282,12 @@ void forAllDrawables(LLCullResult::sg_iterator begin,
 {
 	for (LLCullResult::sg_iterator i = begin; i != end; ++i)
 	{
-		for (LLSpatialGroup::element_iter j = (*i)->getDataBegin(), j_end = (*i)->getDataEnd(); j != j_end; ++j)
+        LLSpatialGroup* group = *i;
+        if (group->isDead())
+        {
+            continue;
+        }
+		for (LLSpatialGroup::element_iter j = group->getDataBegin(); j != group->getDataEnd(); ++j)
 		{
 			if((*j)->hasDrawable())
 			{
@@ -3480,6 +3496,10 @@ void LLPipeline::postSort(LLCamera &camera)
         for (LLCullResult::sg_iterator i = sCull->beginDrawableGroups(); i != sCull->endDrawableGroups(); ++i)
         {
             LLSpatialGroup *group = *i;
+            if (group->isDead())
+            {
+                continue;
+            }
             if (!sUseOcclusion || !group->isOcclusionState(LLSpatialGroup::OCCLUDED))
             {
                 group->rebuildGeom();
@@ -3498,6 +3518,12 @@ void LLPipeline::postSort(LLCamera &camera)
     for (LLCullResult::sg_iterator i = sCull->beginVisibleGroups(); i != sCull->endVisibleGroups(); ++i)
     {
         LLSpatialGroup *group = *i;
+
+        if (group->isDead())
+        {
+            continue;
+        }
+
         if ((sUseOcclusion && group->isOcclusionState(LLSpatialGroup::OCCLUDED)) ||
             (RenderAutoHideSurfaceAreaLimit > 0.f &&
              group->mSurfaceArea > RenderAutoHideSurfaceAreaLimit * llmax(group->mObjectBoxSize, 10.f)))
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 34becf829e97f5e6bf1889064acb8a5403a46c41..362598a37aa934f58b23a93191ac2a03685b5288 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1583,6 +1583,15 @@ function="World.EnvPreset"
                     <menu_item_check.on_click
                      function="Tools.SelectInvisibleObjects"
                      parameter="invisible" />
+            </menu_item_check>
+            <menu_item_check
+                 label="Select Reflection Probes"
+                 name="Select Reflection Probes">
+                    <menu_item_check.on_check
+                     control="SelectReflectionProbes" />
+                    <menu_item_check.on_click
+                     function="Tools.SelectReflectionProbes"
+                     parameter="reflection_probes" />
             </menu_item_check>
                 <menu_item_check
                  label="Select By Surrounding"