diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 979a1a9a60a2cbff7657518151475029aabede3c..c4bfd719991dffdbbbe1f732dd8b4b03ba87da72 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -35,6 +35,8 @@
 #include "lluictrlfactory.h"
 #include "lltextbox.h"
 #include "lllineeditor.h"
+#include "llviewercontrol.h"
+#include "llversionviewer.h"
 
 #include "llcurrencyuimanager.h"
 
@@ -156,6 +158,11 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()
 		"secureSessionId",
 		gAgent.getSecureSessionID().asString());
 	keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
+	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName"));
+	keywordArgs.appendInt("viewerMajorVersion", LL_VERSION_MAJOR);
+	keywordArgs.appendInt("viewerMinorVersion", LL_VERSION_MINOR);
+	keywordArgs.appendInt("viewerPatchVersion", LL_VERSION_PATCH);
+	keywordArgs.appendInt("viewerBuildVersion", LL_VERSION_BUILD);
 	
 	LLXMLRPCValue params = LLXMLRPCValue::createArray();
 	params.append(keywordArgs);
@@ -209,7 +216,12 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)
 	{
 		keywordArgs.appendString("password", password);
 	}
-	
+	keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName"));
+	keywordArgs.appendInt("viewerMajorVersion", LL_VERSION_MAJOR);
+	keywordArgs.appendInt("viewerMinorVersion", LL_VERSION_MINOR);
+	keywordArgs.appendInt("viewerPatchVersion", LL_VERSION_PATCH);
+	keywordArgs.appendInt("viewerBuildVersion", LL_VERSION_BUILD);
+
 	LLXMLRPCValue params = LLXMLRPCValue::createArray();
 	params.append(keywordArgs);
 
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 0276cd9a24577b30960c537faa4015c795ad5149..09b3ce1e863b4acc51ddf94b35ec3845875d4b48 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -278,16 +278,6 @@ void LLFace::setTexture(LLViewerTexture* tex)
 	}
 
 	mTexture = tex ;
-
-	//check if this texture is replaced by a parcel media texture.
-	if(mTexture.notNull() && mTexture->hasParcelMedia()) 
-	{
-		LLViewerMediaTexture* mediap = LLViewerTextureManager::findMediaTexture(mTexture->getID()) ;
-		if(mediap)
-		{
-			mediap->addMediaToFace(this) ;
-		}
-	}
 }
 
 void LLFace::dirtyTexture()
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 63ea990d140c8d3937dad8db67e5472b526d0297..88658f7b9f635581ffeb9973987d00ab18daec42 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -39,6 +39,7 @@
 #include "llagent.h"
 #include "llappviewer.h" 
 #include "llsecondlifeurls.h"
+#include "llvoiceclient.h"
 #include "lluictrlfactory.h"
 #include "llviewertexteditor.h"
 #include "llviewercontrol.h"
@@ -268,6 +269,7 @@ LLSD LLFloaterAbout::getInfo()
 	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
 	bool want_fullname = true;
 	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
+	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
 
 	// TODO: Implement media plugin version query
 	info["QT_WEBKIT_VERSION"] = "4.5.2";
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index 4c83530f43b9784de5a9efdbca99618f02a7dc9b..bd9798c18e144c33fd037dd05c30951c2dbca779 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -34,6 +34,7 @@
 #include "llviewerprecompiledheaders.h"
 #include "llfloatersearch.h"
 #include "llmediactrl.h"
+#include "llagent.h"
 
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
@@ -117,6 +118,14 @@ void LLFloaterSearch::search(const LLSD &key)
 	std::string search_text = key.has("id") ? key["id"].asString() : "";
 	url += std::string("?q=") + search_text;
 
+	// append the maturity and teen capabilities for this agent
+	BOOL godlike = gAgent.isGodlike();
+	bool mature_enabled = gAgent.canAccessMature() || godlike;
+	bool adult_enabled = gAgent.canAccessAdult() || godlike;
+	std::string mature = (mature_enabled) ? "True" : "False";
+	std::string teen = (!adult_enabled) ? "True" : "False";
+	url += "&t=" + teen + "&m=" + mature;
+
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
 }
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 28ef128265b4191eb63252004b5b31548d982ce1..758bf8c1aa012d501fe5e7a6cceba660788b76e9 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -416,7 +416,7 @@ void LLViewerTexture::init(bool firstinit)
 	mDontDiscard = FALSE;
 	mMaxVirtualSize = 0.f;
 	mNeedsResetMaxVirtualSize = FALSE ;
-	mHasParcelMedia = FALSE ;
+	mParcelMedia = NULL ;
 }
 
 //virtual 
@@ -2148,6 +2148,12 @@ void LLViewerMediaTexture::updateClass()
 {
 	static const F32 MAX_INACTIVE_TIME = 30.f ;
 
+#if 0
+	//force to play media.
+	gSavedSettings.setBOOL("AudioSteamingMedia", true) ;
+	gSavedSettings.setBOOL("AudioStreamingVideo", true) ;
+#endif
+
 	for(media_map_t::iterator iter = sMediaMap.begin() ; iter != sMediaMap.end(); )
 	{
 		LLViewerMediaTexture* mediap = iter->second;	
@@ -2221,17 +2227,17 @@ LLViewerMediaTexture::LLViewerMediaTexture(const LLUUID& id, BOOL usemipmaps, LL
 	LLViewerTexture* tex = gTextureList.findImage(mID) ;
 	if(tex) //this media is a parcel media for tex.
 	{
-		tex->setParcelMedia(TRUE) ;
-		mParcelTexture = tex ;
+		tex->setParcelMedia(this) ;
 	}
 }
 
 //virtual 
 LLViewerMediaTexture::~LLViewerMediaTexture() 
 {	
-	if(mParcelTexture.notNull())
+	LLViewerTexture* tex = gTextureList.findImage(mID) ;
+	if(tex) //this media is a parcel media for tex.
 	{
-		mParcelTexture->setParcelMedia(FALSE) ;
+		tex->setParcelMedia(NULL) ;
 	}
 }
 
@@ -2283,21 +2289,11 @@ BOOL LLViewerMediaTexture::findFaces()
 	mMediaFaceList.clear() ;
 
 	BOOL ret = TRUE ;
-
-	//for parcel media
-	if(mParcelTexture.isNull())
-	{
-		LLViewerTexture* tex = gTextureList.findImage(mID) ;
-		if(tex)
-		{
-			tex->setParcelMedia(TRUE) ;
-			mParcelTexture = tex ;
-		}
-	}
 	
-	if(mParcelTexture.notNull())
+	LLViewerTexture* tex = gTextureList.findImage(mID) ;
+	if(tex) //this media is a parcel media for tex.
 	{
-		const ll_face_list_t* face_list = mParcelTexture->getFaceList() ;
+		const ll_face_list_t* face_list = tex->getFaceList() ;
 		for(ll_face_list_t::const_iterator iter = face_list->begin(); iter != face_list->end(); ++iter)
 		{
 			mMediaFaceList.push_back(*iter) ;
@@ -2404,11 +2400,6 @@ void LLViewerMediaTexture::addFace(LLFace* facep)
 	if(facep->getTexture() && facep->getTexture() != this && facep->getTexture()->getID() == mID)
 	{
 		mTextureList.push_back(facep->getTexture()) ; //a parcel media.
-		if(mParcelTexture.isNull())
-		{			
-			mParcelTexture = facep->getTexture() ;
-			mParcelTexture->setParcelMedia(TRUE) ;
-		}
 		return ;
 	}
 	
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index ce8c47b87833a37437f0d251da441e667cdb0558..020478beef2c6026ebebe3a9d694df1ff1236f82 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -221,8 +221,9 @@ public:
 	BOOL getDontDiscard() const { return mDontDiscard; }
 	//-----------------	
 	
-	void setParcelMedia(BOOL has_media) {mHasParcelMedia = has_media;}
-	BOOL hasParcelMedia() const { return mHasParcelMedia ;}
+	void setParcelMedia(LLViewerMediaTexture* media) {mParcelMedia = media;}
+	BOOL hasParcelMedia() const { return mParcelMedia != NULL;}
+	LLViewerMediaTexture* getParcelMedia() const { return mParcelMedia;}
 
 	/*virtual*/ void updateBindStatsForTester() ;
 protected:
@@ -250,7 +251,8 @@ protected:
 	LLPointer<LLImageGL> mGLTexturep ;
 	S8 mDontDiscard;			// Keep full res version of this image (for UI, etc)
 
-	BOOL mHasParcelMedia ;
+	//do not use LLPointer here.
+	LLViewerMediaTexture* mParcelMedia ;
 
 protected:
 	typedef enum 
@@ -552,7 +554,6 @@ private:
 	LLViewerMediaImpl* mMediaImplp ;	
 	BOOL mIsPlaying ;
 	U32  mUpdateVirtualSizeTime ;
-	LLPointer< LLViewerTexture > mParcelTexture ; //the texture replaces this media texure when it is a parcel media texture.
 
 public:
 	static void updateClass() ;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 2834284a9b59a89383bb1e9dcb464cb325c6bb45..df5481c874c91240e1cf862a65507c373cf522f1 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -254,6 +254,7 @@ protected:
 	std::string		nameString;
 	std::string		audioMediaString;
 	std::string		displayNameString;
+	std::string		deviceString;
 	int				participantType;
 	bool			isLocallyMuted;
 	bool			isModeratorMuted;
@@ -485,6 +486,14 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
 			{
 				gVoiceClient->clearRenderDevices();
 			}
+			else if (!stricmp("CaptureDevice", tag))
+			{
+				deviceString.clear();
+			}
+			else if (!stricmp("RenderDevice", tag))
+			{
+				deviceString.clear();
+			}
 			else if (!stricmp("Buddies", tag))
 			{
 				gVoiceClient->deleteAllBuddies();
@@ -508,7 +517,6 @@ void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
 void LLVivoxProtocolParser::EndTag(const char *tag)
 {
 	const std::string& string = textBuffer;
-	bool clearbuffer = true;
 
 	responseDepth--;
 
@@ -580,6 +588,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
 			nameString = string;
 		else if (!stricmp("DisplayName", tag))
 			displayNameString = string;
+		else if (!stricmp("Device", tag))
+			deviceString = string;
 		else if (!stricmp("AccountName", tag))
 			nameString = string;
 		else if (!stricmp("ParticipantType", tag))
@@ -596,18 +606,13 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
 			uriString = string;
 		else if (!stricmp("Presence", tag))
 			statusString = string;
-		else if (!stricmp("Device", tag))
-		{
-			// This closing tag shouldn't clear the accumulated text.
-			clearbuffer = false;
-		}
 		else if (!stricmp("CaptureDevice", tag))
 		{
-			gVoiceClient->addCaptureDevice(textBuffer);
+			gVoiceClient->addCaptureDevice(deviceString);
 		}
 		else if (!stricmp("RenderDevice", tag))
 		{
-			gVoiceClient->addRenderDevice(textBuffer);
+			gVoiceClient->addRenderDevice(deviceString);
 		}
 		else if (!stricmp("Buddy", tag))
 		{
@@ -648,12 +653,8 @@ void LLVivoxProtocolParser::EndTag(const char *tag)
 		else if (!stricmp("SubscriptionType", tag))
 			subscriptionType = string;
 		
-
-		if(clearbuffer)
-		{
-			textBuffer.clear();
-			accumulateText= false;
-		}
+		textBuffer.clear();
+		accumulateText= false;
 		
 		if (responseDepth == 0)
 		{
@@ -1160,7 +1161,8 @@ LLVoiceClient::LLVoiceClient() :
 	mVoiceEnabled(false),
 	mWriteInProgress(false),
 	
-	mLipSyncEnabled(false)
+	mLipSyncEnabled(false),
+	mAPIVersion("Unknown")
 {	
 	gVoiceClient = this;
 	
@@ -3749,6 +3751,7 @@ void LLVoiceClient::connectorCreateResponse(int statusCode, std::string &statusS
 	{
 		// Connector created, move forward.
 		LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL;
+		mAPIVersion = versionID;
 		mConnectorHandle = connectorHandle;
 		if(getState() == stateConnectorStarting)
 		{
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index bddd18dee89c1e16b7985df808f344e20d2306db..9df96d9a5215a2db6f0edf23f9427556e8d09fd5 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -204,6 +204,9 @@ static	void updatePosition(void);
 		void keyDown(KEY key, MASK mask);
 		void keyUp(KEY key, MASK mask);
 		void middleMouseState(bool down);
+
+		// Return the version of the Vivox library
+		std::string getAPIVersion() const { return mAPIVersion; }
 		
 		/////////////////////////////
 		// Accessors for data related to nearby speakers
@@ -739,6 +742,8 @@ static	std::string nameFromsipURI(const std::string &uri);
 		
 		BOOL		mLipSyncEnabled;
 
+		std::string	mAPIVersion;
+
 		typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
 		observer_set_t mParticipantObservers;
 
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 7585842623bee5b7886487e6473cf9db12ff07c3..143cd2d9c63a3d5540041c0884f428ada43d2418 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -249,6 +249,12 @@ BOOL LLVOPartGroup::updateGeometry(LLDrawable *drawable)
 		facep->mCenterLocal = part->mPosAgent;
 		facep->setFaceColor(part->mColor);
 		facep->setTexture(part->mImagep);
+			
+		//check if this particle texture is replaced by a parcel media texture.
+		if(part->mImagep.notNull() && part->mImagep->hasParcelMedia()) 
+		{
+			part->mImagep->getParcelMedia()->addMediaToFace(facep) ;
+		}
 
 		mPixelArea = tot_area * pixel_meter_ratio;
 		const F32 area_scale = 10.f; // scale area to increase priority a bit
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index 02c6ed1b20891faec72b8131a03aa783d38c8dd4..3f2636ae52c22a8992d3f301db33781a3cf653fe 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -49,6 +49,7 @@ libcurl Version: [LIBCURL_VERSION]
 J2C Decoder Version: [J2C_VERSION]
 Audio Driver Version: [AUDIO_DRIVER_VERSION]
 Qt Webkit Version: [QT_WEBKIT_VERSION]
+Vivox Version: [VIVOX_VERSION]
 </floater.string>
   <floater.string
      name="none">