diff --git a/indra/llmessage/llsdappservices.cpp b/indra/llmessage/llsdappservices.cpp
index c10e9bd11343148c14b4e75d6780595d115b34ca..7b8e6788473949d6acfa24c847cf5767c56a55e6 100644
--- a/indra/llmessage/llsdappservices.cpp
+++ b/indra/llmessage/llsdappservices.cpp
@@ -242,7 +242,7 @@ class LLHTTPLiveConfigSingleService : public LLHTTPNode
 		llinfos << "LLHTTPLiveConfigSingleService::validate(" << name
 			<< ")" << llendl;
 		LLSD option = LLApp::instance()->getOption(name);
-		if(option) return true;
+		if(option.isDefined()) return true;
 		else return false;
 	}
 
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 3eddc04259b42c4b33149867c03eb976a5b43e07..4b2445459f85fb6abf884c8df51b1b1657459699 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -231,6 +231,9 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S3
 {
 	llassert( object );
 
+	//remember primary object
+	mSelectedObjects->mPrimaryObject = object;
+
 	// Don't add an object that is already in the list
 	if (object->isSelected() ) {
 		// make sure point at position is updated
@@ -291,6 +294,9 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj,
 {
 	llassert( obj );
 
+	//remember primary object
+	mSelectedObjects->mPrimaryObject = obj;
+
 	// This may be incorrect if things weren't family selected before... - djs 07/08/02
 	// Don't add an object that is already in the list
 	if (obj->isSelected() ) 
@@ -372,6 +378,9 @@ LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<
 	LLViewerObject *object;
 	S32 i;
 
+	//clear primary object (no primary object)
+	mSelectedObjects->mPrimaryObject = NULL;
+
 	if (object_list.count() < 1) return NULL;
 
 	// NOTE -- we add the objects in REVERSE ORDER 
@@ -842,6 +851,9 @@ LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()
 		return NULL;
 	}
 
+	//clear primary object
+	mSelectedObjects->mPrimaryObject = NULL;
+
 	LLSelectNode *nodep;
 	for (nodep = mHighlightedObjects->getFirstNode();
 		nodep;
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index c0ddad41ebcf7442ec65d1abef3b630a4f3d0c13..04d55dcf7dd4a9fba906f2516770ba846c7c42f2 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -125,6 +125,7 @@ class LLObjectSelection : public std::list<LLSelectNode*>, public LLRefCount
 	LLViewerObject*	getFirstCopyableObject(BOOL get_root = FALSE);
 	LLViewerObject* getFirstDeleteableObject(BOOL get_root = FALSE);
 	LLViewerObject*	getFirstMoveableObject(BOOL get_root = FALSE);
+	LLViewerObject* getPrimaryObject() { return mPrimaryObject; }
 
 	// iterate through texture entries
 	void getPrimaryTE(LLViewerObject* *object, S32 *te);
@@ -161,6 +162,7 @@ class LLObjectSelection : public std::list<LLSelectNode*>, public LLRefCount
 private:
 	const LLObjectSelection &operator=(const LLObjectSelection &);
 
+	LLPointer<LLViewerObject>					mPrimaryObject;
 	std::list<LLSelectNode*>::iterator			mCurrentNode;
 	S32											mCurrentTE;
 	std::map<LLViewerObject*, LLSelectNode*>	mSelectNodeMap;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 64560efd67cfb6e81c6549ee4fb6de69ea140e68..9ac566b02b7b5b0d167b3138d1511af1808fe33f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6096,7 +6096,7 @@ void complete_give_money(S32 option, void* user_data)
 	LLObjectSelectionHandle handle(*(LLObjectSelectionHandle*)user_data);
 	delete (LLObjectSelectionHandle*)user_data;
 
-	LLViewerObject *objectp = handle->getFirstRootObject();
+	LLViewerObject* objectp = handle->getPrimaryObject();
 
 	// Show avatar's name if paying attachment
 	if (objectp && objectp->isAttachment())
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index d7abae32c893557e9c3a7ffd3f985ed9e2d6e825..c7ecb225fb362e20146861c24b66a3dc811f7bfd 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -4763,57 +4763,47 @@ void LLPipeline::generateReflectionMap(LLCubeMap* cube_map, LLCamera& cube_cam,
 //send cube map vertices and texture coordinates
 void render_cube_map()
 {
-	if (gPipeline.mCubeList == 0)
-	{
-		gPipeline.mCubeList = glGenLists(1);
-		glNewList(gPipeline.mCubeList, GL_COMPILE);
-
-		U32 idx[36];
+	
+	U32 idx[36];
 
-		idx[0] = 1; idx[1] = 0; idx[2] = 2; //front
-		idx[3] = 3; idx[4] = 2; idx[5] = 0;
+	idx[0] = 1; idx[1] = 0; idx[2] = 2; //front
+	idx[3] = 3; idx[4] = 2; idx[5] = 0;
 
-		idx[6] = 4; idx[7] = 5; idx[8] = 1; //top
-		idx[9] = 0; idx[10] = 1; idx[11] = 5; 
+	idx[6] = 4; idx[7] = 5; idx[8] = 1; //top
+	idx[9] = 0; idx[10] = 1; idx[11] = 5; 
 
-		idx[12] = 5; idx[13] = 4; idx[14] = 6; //back
-		idx[15] = 7; idx[16] = 6; idx[17] = 4;
+	idx[12] = 5; idx[13] = 4; idx[14] = 6; //back
+	idx[15] = 7; idx[16] = 6; idx[17] = 4;
 
-		idx[18] = 6; idx[19] = 7; idx[20] = 3; //bottom
-		idx[21] = 2; idx[22] = 3; idx[23] = 7;
+	idx[18] = 6; idx[19] = 7; idx[20] = 3; //bottom
+	idx[21] = 2; idx[22] = 3; idx[23] = 7;
 
-		idx[24] = 0; idx[25] = 5; idx[26] = 3; //left
-		idx[27] = 6; idx[28] = 3; idx[29] = 5;
+	idx[24] = 0; idx[25] = 5; idx[26] = 3; //left
+	idx[27] = 6; idx[28] = 3; idx[29] = 5;
 
-		idx[30] = 4; idx[31] = 1; idx[32] = 7; //right
-		idx[33] = 2; idx[34] = 7; idx[35] = 1;
+	idx[30] = 4; idx[31] = 1; idx[32] = 7; //right
+	idx[33] = 2; idx[34] = 7; idx[35] = 1;
 
-		LLVector3 vert[8];
-		LLVector3 r = LLVector3(1,1,1);
+	LLVector3 vert[8];
+	LLVector3 r = LLVector3(1,1,1);
 
-		vert[0] = r.scaledVec(LLVector3(-1,1,1)); //   0 - left top front
-		vert[1] = r.scaledVec(LLVector3(1,1,1));  //   1 - right top front
-		vert[2] = r.scaledVec(LLVector3(1,-1,1)); //   2 - right bottom front
-		vert[3] = r.scaledVec(LLVector3(-1,-1,1)); //  3 - left bottom front
+	vert[0] = r.scaledVec(LLVector3(-1,1,1)); //   0 - left top front
+	vert[1] = r.scaledVec(LLVector3(1,1,1));  //   1 - right top front
+	vert[2] = r.scaledVec(LLVector3(1,-1,1)); //   2 - right bottom front
+	vert[3] = r.scaledVec(LLVector3(-1,-1,1)); //  3 - left bottom front
 
-		vert[4] = r.scaledVec(LLVector3(1,1,-1)); //  4 - left top back
-		vert[5] = r.scaledVec(LLVector3(-1,1,-1)); //   5 - right top back
-		vert[6] = r.scaledVec(LLVector3(-1,-1,-1)); //  6 - right bottom back
-		vert[7] = r.scaledVec(LLVector3(1,-1,-1)); // 7 -left bottom back
+	vert[4] = r.scaledVec(LLVector3(1,1,-1)); //  4 - left top back
+	vert[5] = r.scaledVec(LLVector3(-1,1,-1)); //   5 - right top back
+	vert[6] = r.scaledVec(LLVector3(-1,-1,-1)); //  6 - right bottom back
+	vert[7] = r.scaledVec(LLVector3(1,-1,-1)); // 7 -left bottom back
 
-		glBegin(GL_TRIANGLES);
-		for (U32 i = 0; i < 36; i++)
-		{
-			glTexCoord3fv(vert[idx[i]].mV);
-			glVertex3fv(vert[idx[i]].mV);
-		}
-		glEnd();
-
-		glEndList();
+	glBegin(GL_TRIANGLES);
+	for (U32 i = 0; i < 36; i++)
+	{
+		glTexCoord3fv(vert[idx[i]].mV);
+		glVertex3fv(vert[idx[i]].mV);
 	}
-
-	glCallList(gPipeline.mCubeList);
-
+	glEnd();
 }
 
 void LLPipeline::blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out, U32 res)