diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index dd79ad52805363dee83b4e3c818345b994e2f623..a574588b1ac64f84a41d6f75d0195a25ee1eef4b 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -2042,7 +2042,6 @@ bool LLAppViewer::cleanup()
 	//Note:
 	//SUBSYSTEM_CLEANUP(LLViewerMedia) has to be put before gTextureList.shutdown()
 	//because some new image might be generated during cleaning up media. --bao
-	SUBSYSTEM_CLEANUP(LLViewerParcelMedia);
 	gTextureList.shutdown(); // shutdown again in case a callback added something
 	LLUIImageList::getInstance()->cleanUp();
 
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index a85e9e3882e1b019463e1a9491920814db60f57c..2dca55514d2b39f3ed28dc6464a3ce478e7c4e25 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -567,7 +567,7 @@ void LLPanelNearByMedia::refreshParcelItems()
 	if (NULL != mParcelMediaItem)
 	{
 		std::string name, url, tooltip;
-		getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
+		getNameAndUrlHelper(LLViewerParcelMedia::getInstance()->getParcelMedia(), name, url, "");
 		if (name.empty() || name == url)
 		{
 			tooltip = url;
@@ -576,13 +576,13 @@ void LLPanelNearByMedia::refreshParcelItems()
 		{
 			tooltip = name + " : " + url;
 		}
-		LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
+		LLViewerMediaImpl *impl = LLViewerParcelMedia::getInstance()->getParcelMedia();
 		updateListItem(mParcelMediaItem,
 					   mParcelMediaName,
 					   tooltip,
 					   -2, // Proximity closer than anything else, before Parcel Audio
 					   impl == NULL || impl->isMediaDisabled(),
-					   impl != NULL && !LLViewerParcelMedia::getURL().empty(),
+					   impl != NULL && !LLViewerParcelMedia::getInstance()->getURL().empty(),
 					   impl != NULL && impl->isMediaTimeBased() &&	impl->isMediaPlaying(),
 					   MEDIA_CLASS_ALL,
 					   "parcel media");
@@ -790,14 +790,14 @@ void LLPanelNearByMedia::onClickEnableParcelMedia()
 {	
 	if ( ! LLViewerMedia::getInstance()->isParcelMediaPlaying() )
 	{
-		LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+		LLViewerParcelMedia::getInstance()->play(LLViewerParcelMgr::getInstance()->getAgentParcel());
 	}
 }
 
 void LLPanelNearByMedia::onClickDisableParcelMedia()
 {	
 	// This actually unloads the impl, as opposed to "stop"ping the media
-	LLViewerParcelMedia::stop();
+	LLViewerParcelMedia::getInstance()->stop();
 }
 
 void LLPanelNearByMedia::onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id)
@@ -855,22 +855,22 @@ void LLPanelNearByMedia::onZoomMedia(void* user_data)
 
 void LLPanelNearByMedia::onClickParcelMediaPlay()
 {
-	LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+	LLViewerParcelMedia::getInstance()->play(LLViewerParcelMgr::getInstance()->getAgentParcel());
 }
 
 void LLPanelNearByMedia::onClickParcelMediaStop()
 {	
-	if (LLViewerParcelMedia::getParcelMedia())
+	if (LLViewerParcelMedia::getInstance()->getParcelMedia())
 	{
 		// This stops the media playing, as opposed to unloading it like
 		// LLViewerParcelMedia::stop() does
-		LLViewerParcelMedia::getParcelMedia()->stop();
+		LLViewerParcelMedia::getInstance()->getParcelMedia()->stop();
 	}
 }
 
 void LLPanelNearByMedia::onClickParcelMediaPause()
 {
-	LLViewerParcelMedia::pause();
+	LLViewerParcelMedia::getInstance()->pause();
 }
 
 void LLPanelNearByMedia::onClickParcelAudioPlay()
@@ -1008,7 +1008,7 @@ void LLPanelNearByMedia::updateControls()
 			showDisabledControls();
 		}
 		else {
-			LLViewerMediaImpl* impl = LLViewerParcelMedia::getParcelMedia();
+			LLViewerMediaImpl* impl = LLViewerParcelMedia::getInstance()->getParcelMedia();
 			if (NULL == impl)
 			{
 				// Just means it hasn't started yet
@@ -1119,7 +1119,7 @@ void LLPanelNearByMedia::onClickSelectedMediaPlay()
 	if (selected_media_id != PARCEL_AUDIO_LIST_ITEM_UUID)
 	{
 		LLViewerMediaImpl *impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
-			((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
+			((LLViewerMediaImpl*)LLViewerParcelMedia::getInstance()->getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
 		if (NULL != impl)
 		{
 			if (impl->isMediaTimeBased() && impl->isMediaPaused())
@@ -1130,7 +1130,7 @@ void LLPanelNearByMedia::onClickSelectedMediaPlay()
 			}
 			else if (impl->isParcelMedia())
 			{
-				LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+				LLViewerParcelMedia::getInstance()->play(LLViewerParcelMgr::getInstance()->getAgentParcel());
 			}
 		}
 	}	
@@ -1165,7 +1165,7 @@ void LLPanelNearByMedia::onClickSelectedMediaMute()
 	}
 	else {
 		LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
-			((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
+			((LLViewerMediaImpl*)LLViewerParcelMedia::getInstance()->getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
 		if (NULL != impl)
 		{
 			F32 volume = impl->getVolume();
@@ -1196,7 +1196,7 @@ void LLPanelNearByMedia::onCommitSelectedMediaVolume()
 	}
 	else {
 		LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
-			((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
+			((LLViewerMediaImpl*)LLViewerParcelMedia::getInstance()->getParcelMedia()) : LLViewerMedia::getInstance()->getMediaImplFromTextureID(selected_media_id);
 		if (NULL != impl)
 		{
 			impl->setVolume(mVolumeSlider->getValueF32());
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index d3be7c64f8ddc71c3b8f4b578f2fc77cf0bcbf50..8be453ad6c389438ac59a2599a619ac0af73b2bd 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -2806,9 +2806,6 @@ void LLStartUp::multimediaInit()
 	std::string msg = LLTrans::getString("LoginInitializingMultimedia");
 	set_startup_status(0.42f, msg.c_str(), gAgent.mMOTD.c_str());
 	display_startup();
-
-	// LLViewerMedia::initClass();
-	LLViewerParcelMedia::initClass();
 }
 
 void LLStartUp::fontInit()
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 82111cb78a80102b453149c1fe142b334dce0aa2..63e84ccbbd3cf69065cb8a334b3f4faecc2ae347 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1457,19 +1457,19 @@ static void handle_click_action_play()
 	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 	if (!parcel) return;
 
-	LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getStatus();
+	LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getInstance()->getStatus();
 	switch(status)
 	{
 		case LLViewerMediaImpl::MEDIA_PLAYING:
-			LLViewerParcelMedia::pause();
+			LLViewerParcelMedia::getInstance()->pause();
 			break;
 
 		case LLViewerMediaImpl::MEDIA_PAUSED:
-			LLViewerParcelMedia::start();
+			LLViewerParcelMedia::getInstance()->start();
 			break;
 
 		default:
-			LLViewerParcelMedia::play(parcel);
+			LLViewerParcelMedia::getInstance()->play(parcel);
 			break;
 	}
 }
@@ -1706,7 +1706,7 @@ static ECursorType cursor_from_parcel_media(U8 click_action)
 
 	open_cursor = UI_CURSOR_TOOLMEDIAOPEN;
 
-	LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getStatus();
+	LLViewerMediaImpl::EMediaStatus status = LLViewerParcelMedia::getInstance()->getStatus();
 	switch(status)
 	{
 		case LLViewerMediaImpl::MEDIA_PLAYING:
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 1e218eef1253af8633f8bcf1eaf5e2b21e01c5c8..857799889bb871c066363f6da01c0d05bf89b044 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -952,7 +952,7 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
 	{
 		if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia())
 		{
-			LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+			LLViewerParcelMedia::getInstance()->play(LLViewerParcelMgr::getInstance()->getAgentParcel());
 		}
 
 		static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true);
@@ -974,7 +974,7 @@ void LLViewerMedia::setAllMediaEnabled(bool val)
 	}
 	else {
 		// This actually unloads the impl, as opposed to "stop"ping the media
-		LLViewerParcelMedia::stop();
+		LLViewerParcelMedia::getInstance()->stop();
 		if (gAudiop)
 		{
 			LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
@@ -1023,7 +1023,7 @@ void LLViewerMedia::setAllMediaPaused(bool val)
     {
         if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia())
         {
-            LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+            LLViewerParcelMedia::getInstance()->play(LLViewerParcelMgr::getInstance()->getAgentParcel());
         }
 
         static LLCachedControl<bool> audio_streaming_music(gSavedSettings, "AudioStreamingMusic", true);
@@ -1045,7 +1045,7 @@ void LLViewerMedia::setAllMediaPaused(bool val)
     }
     else {
         // This actually unloads the impl, as opposed to "stop"ping the media
-        LLViewerParcelMedia::stop();
+        LLViewerParcelMedia::getInstance()->stop();
         if (gAudiop)
         {
             LLViewerAudio::getInstance()->stopInternetStreamWithAutoFade();
@@ -1056,7 +1056,8 @@ void LLViewerMedia::setAllMediaPaused(bool val)
 //////////////////////////////////////////////////////////////////////////////////////////
 bool LLViewerMedia::isParcelMediaPlaying()
 {
-	return (LLViewerMedia::hasParcelMedia() && LLViewerParcelMedia::getParcelMedia() && LLViewerParcelMedia::getParcelMedia()->hasMedia());
+    viewer_media_t media = LLViewerParcelMedia::getInstance()->getParcelMedia();
+    return (LLViewerMedia::hasParcelMedia() && media && media->hasMedia());
 }
 
 /////////////////////////////////////////////////////////////////////////////////////////
@@ -1470,7 +1471,7 @@ bool LLViewerMedia::hasInWorldMedia()
 //////////////////////////////////////////////////////////////////////////////////////////
 bool LLViewerMedia::hasParcelMedia()
 {
-	return !LLViewerParcelMedia::getURL().empty();
+	return !LLViewerParcelMedia::getInstance()->getURL().empty();
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index cbc276b7e26a011821e4d552852f8fe347426ccc..30291d1a93d84b60eb24a8e821713dd557cc4379 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -45,31 +45,23 @@
 #include "llviewertexture.h"
 #include "llcorehttputil.h"
 
-// Static Variables
 
-S32 LLViewerParcelMedia::sMediaParcelLocalID = 0;
-LLUUID LLViewerParcelMedia::sMediaRegionID;
-viewer_media_t LLViewerParcelMedia::sMediaImpl;
-
-
-// static
-void LLViewerParcelMedia::initClass()
+LLViewerParcelMedia::LLViewerParcelMedia():
+mMediaParcelLocalID(0)
 {
 	LLMessageSystem* msg = gMessageSystem;
-	msg->setHandlerFunc("ParcelMediaCommandMessage", processParcelMediaCommandMessage );
-	msg->setHandlerFunc("ParcelMediaUpdate", processParcelMediaUpdate );
+	msg->setHandlerFunc("ParcelMediaCommandMessage", parcelMediaCommandMessageHandler );
+	msg->setHandlerFunc("ParcelMediaUpdate", parcelMediaUpdateHandler );
 	LLViewerParcelMediaAutoPlay::initClass();
 }
 
-//static 
-void LLViewerParcelMedia::cleanupClass()
+LLViewerParcelMedia::~LLViewerParcelMedia()
 {
 	// This needs to be destroyed before global destructor time.
-	sMediaImpl = NULL;
+	mMediaImpl = NULL;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
-// static
 void LLViewerParcelMedia::update(LLParcel* parcel)
 {
 	if (/*LLViewerMedia::hasMedia()*/ true)
@@ -79,7 +71,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 		{
 			if(!gAgent.getRegion())
 			{
-				sMediaRegionID = LLUUID() ;
+				mMediaRegionID = LLUUID() ;
 				stop() ;
 				LL_DEBUGS("Media") << "no agent region, bailing out." << LL_ENDL;
 				return ;				
@@ -89,11 +81,11 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			S32 parcelid = parcel->getLocalID();						
 
 			LLUUID regionid = gAgent.getRegion()->getRegionID();
-			if (parcelid != sMediaParcelLocalID || regionid != sMediaRegionID)
+			if (parcelid != mMediaParcelLocalID || regionid != mMediaRegionID)
 			{
 				LL_DEBUGS("Media") << "New parcel, parcel id = " << parcelid << ", region id = " << regionid << LL_ENDL;
-				sMediaParcelLocalID = parcelid;
-				sMediaRegionID = regionid;
+				mMediaParcelLocalID = parcelid;
+				mMediaRegionID = regionid;
 			}
 
 			std::string mediaUrl = std::string ( parcel->getMediaURL () );
@@ -108,19 +100,19 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			LLStringUtil::trim(mediaUrl);
 			
 			// If no parcel media is playing, nothing left to do
-			if(sMediaImpl.isNull())
+			if(mMediaImpl.isNull())
 
 			{
 				return;
 			}
 
 			// Media is playing...has something changed?
-			else if (( sMediaImpl->getMediaURL() != mediaUrl )
-				|| ( sMediaImpl->getMediaTextureID() != parcel->getMediaID() )
-				|| ( sMediaImpl->getMimeType() != parcel->getMediaType() ))
+			else if (( mMediaImpl->getMediaURL() != mediaUrl )
+				|| ( mMediaImpl->getMediaTextureID() != parcel->getMediaID() )
+				|| ( mMediaImpl->getMimeType() != parcel->getMediaType() ))
 			{
 				// Only play if the media types are the same.
-				if(sMediaImpl->getMimeType() == parcel->getMediaType())
+				if(mMediaImpl->getMimeType() == parcel->getMediaType())
 				{
 					play(parcel);
 				}
@@ -176,30 +168,30 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 	S32 media_width = parcel->getMediaWidth();
 	S32 media_height = parcel->getMediaHeight();
 
-	if(sMediaImpl)
+	if(mMediaImpl)
 	{
 		// If the url and mime type are the same, call play again
-		if(sMediaImpl->getMediaURL() == media_url 
-			&& sMediaImpl->getMimeType() == mime_type
-			&& sMediaImpl->getMediaTextureID() == placeholder_texture_id)
+		if(mMediaImpl->getMediaURL() == media_url 
+			&& mMediaImpl->getMimeType() == mime_type
+			&& mMediaImpl->getMediaTextureID() == placeholder_texture_id)
 		{
 			LL_DEBUGS("Media") << "playing with existing url " << media_url << LL_ENDL;
 
-			sMediaImpl->play();
+			mMediaImpl->play();
 		}
 		// Else if the texture id's are the same, navigate and rediscover type
 		// MBW -- This causes other state from the previous parcel (texture size, autoscale, and looping) to get re-used incorrectly.
 		// It's also not really necessary -- just creating a new instance is fine.
-//		else if(sMediaImpl->getMediaTextureID() == placeholder_texture_id)
+//		else if(mMediaImpl->getMediaTextureID() == placeholder_texture_id)
 //		{
-//			sMediaImpl->navigateTo(media_url, mime_type, true);
+//			mMediaImpl->navigateTo(media_url, mime_type, true);
 //		}
 		else
 		{
 			// Since the texture id is different, we need to generate a new impl
 
 			// Delete the old one first so they don't fight over the texture.
-			sMediaImpl = NULL;
+			mMediaImpl = NULL;
 			
 			// A new impl will be created below.
 		}
@@ -208,19 +200,19 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 	// Don't ever try to play if the media type is set to "none/none"
 	if(stricmp(mime_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0)
 	{
-		if(!sMediaImpl)
+		if(!mMediaImpl)
 		{
 			LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
 
 			// There is no media impl, make a new one
-			sMediaImpl = LLViewerMedia::getInstance()->newMediaImpl(
+			mMediaImpl = LLViewerMedia::getInstance()->newMediaImpl(
 				placeholder_texture_id,
 				media_width, 
 				media_height, 
 				media_auto_scale,
 				media_loop);
-			sMediaImpl->setIsParcelMedia(true);
-			sMediaImpl->navigateTo(media_url, mime_type, true);
+			mMediaImpl->setIsParcelMedia(true);
+			mMediaImpl->navigateTo(media_url, mime_type, true);
 		}
 
 		//LLFirstUse::useMedia();
@@ -232,7 +224,7 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
 // static
 void LLViewerParcelMedia::stop()
 {
-	if(sMediaImpl.isNull())
+	if(mMediaImpl.isNull())
 	{
 		return;
 	}
@@ -241,27 +233,27 @@ void LLViewerParcelMedia::stop()
 	LLViewerMediaFocus::getInstance()->clearFocus();
 
 	// This will unload & kill the media instance.
-	sMediaImpl = NULL;
+	mMediaImpl = NULL;
 }
 
 // static
 void LLViewerParcelMedia::pause()
 {
-	if(sMediaImpl.isNull())
+	if(mMediaImpl.isNull())
 	{
 		return;
 	}
-	sMediaImpl->pause();
+	mMediaImpl->pause();
 }
 
 // static
 void LLViewerParcelMedia::start()
 {
-	if(sMediaImpl.isNull())
+	if(mMediaImpl.isNull())
 	{
 		return;
 	}
-	sMediaImpl->start();
+	mMediaImpl->start();
 
 	//LLFirstUse::useMedia();
 
@@ -271,17 +263,17 @@ void LLViewerParcelMedia::start()
 // static
 void LLViewerParcelMedia::seek(F32 time)
 {
-	if(sMediaImpl.isNull())
+	if(mMediaImpl.isNull())
 	{
 		return;
 	}
-	sMediaImpl->seek(time);
+	mMediaImpl->seek(time);
 }
 
 // static
 void LLViewerParcelMedia::focus(bool focus)
 {
-	sMediaImpl->focus(focus);
+	mMediaImpl->focus(focus);
 }
 
 // static
@@ -289,9 +281,9 @@ LLPluginClassMediaOwner::EMediaStatus LLViewerParcelMedia::getStatus()
 {	
 	LLPluginClassMediaOwner::EMediaStatus result = LLPluginClassMediaOwner::MEDIA_NONE;
 	
-	if(sMediaImpl.notNull() && sMediaImpl->hasMedia())
+	if(mMediaImpl.notNull() && mMediaImpl->hasMedia())
 	{
-		result = sMediaImpl->getMediaPlugin()->getStatus();
+		result = mMediaImpl->getMediaPlugin()->getStatus();
 	}
 	
 	return result;
@@ -300,15 +292,15 @@ LLPluginClassMediaOwner::EMediaStatus LLViewerParcelMedia::getStatus()
 // static
 std::string LLViewerParcelMedia::getMimeType()
 {
-	return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : LLMIMETypes::getDefaultMimeType();
+	return mMediaImpl.notNull() ? mMediaImpl->getMimeType() : LLMIMETypes::getDefaultMimeType();
 }
 
 //static 
 std::string LLViewerParcelMedia::getURL()
 {
 	std::string url;
-	if(sMediaImpl.notNull())
-		url = sMediaImpl->getMediaURL();
+	if(mMediaImpl.notNull())
+		url = mMediaImpl->getMediaURL();
 	
 	if(stricmp(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaType().c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0)
 	{
@@ -325,19 +317,24 @@ std::string LLViewerParcelMedia::getURL()
 //static 
 std::string LLViewerParcelMedia::getName()
 {
-	if(sMediaImpl.notNull())
-		return sMediaImpl->getName();
+	if(mMediaImpl.notNull())
+		return mMediaImpl->getName();
 	return "";
 }
 
 viewer_media_t LLViewerParcelMedia::getParcelMedia()
 {
-	return sMediaImpl;
+	return mMediaImpl;
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////
 // static
-void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
+void LLViewerParcelMedia::parcelMediaCommandMessageHandler(LLMessageSystem *msg, void **)
+{
+    getInstance()->processParcelMediaCommandMessage(msg);
+}
+
+void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg)
 {
 	// extract the agent id
 	//	LLUUID agent_id;
@@ -392,7 +389,7 @@ void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg
 
 	if (flags & (1<<PARCEL_MEDIA_COMMAND_TIME))
 	{
-		if(sMediaImpl.isNull())
+		if(mMediaImpl.isNull())
 		{
 			LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 			play(parcel);
@@ -403,7 +400,12 @@ void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg
 
 //////////////////////////////////////////////////////////////////////////////////////////
 // static
-void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg, void ** )
+void LLViewerParcelMedia::parcelMediaUpdateHandler(LLMessageSystem *msg, void **)
+{
+    getInstance()->processParcelMediaUpdate(msg);
+}
+
+void LLViewerParcelMedia::processParcelMediaUpdate( LLMessageSystem *msg)
 {
 	LLUUID media_id;
 	std::string media_url;
diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h
index 534f65b4193795f4f045e0eaffa73f7d6e31c04d..779a65bdf83a5cb239b485e2379bc21ec2675658 100644
--- a/indra/newview/llviewerparcelmedia.h
+++ b/indra/newview/llviewerparcelmedia.h
@@ -37,50 +37,53 @@ class LLViewerParcelMediaNavigationObserver;
 // This class understands land parcels, network traffic, LSL media
 // transport commands, and talks to the LLViewerMedia class to actually
 // do playback.  It allows us to remove code from LLViewerParcelMgr.
-class LLViewerParcelMedia : public LLViewerMediaObserver
+class LLViewerParcelMedia : public LLViewerMediaObserver, public LLSingleton<LLViewerParcelMedia>
 {
+	LLSINGLETON(LLViewerParcelMedia);
+	~LLViewerParcelMedia();
 	LOG_CLASS(LLViewerParcelMedia);
-	public:
-		static void initClass();
-		static void cleanupClass();
-
-		static void update(LLParcel* parcel);
-			// called when the agent's parcel has a new URL, or the agent has
-			// walked on to a new parcel with media
-
-		static void play(LLParcel* parcel);
-			// user clicked play button in media transport controls
-
-		static void stop();
-			// user clicked stop button in media transport controls
-
-		static void pause();
-		static void start();
-			// restart after pause - no need for all the setup
-
-		static void focus(bool focus);
-
-		static void seek(F32 time);
-		    // jump to timecode time
-
-		static LLPluginClassMediaOwner::EMediaStatus getStatus();
-		static std::string getMimeType();
-		static std::string getURL();
-		static std::string getName();
-		static viewer_media_t getParcelMedia();
-
-		static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
-		static void processParcelMediaUpdate( LLMessageSystem *msg, void ** );
-		static void sendMediaNavigateMessage(const std::string& url);
-		
-		// inherited from LLViewerMediaObserver
-		virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
-
-	public:
-		static S32 sMediaParcelLocalID;
-		static LLUUID sMediaRegionID;
-		// HACK: this will change with Media on a Prim
-		static viewer_media_t sMediaImpl;
+public:
+	void update(LLParcel* parcel);
+	// called when the agent's parcel has a new URL, or the agent has
+	// walked on to a new parcel with media
+
+	void play(LLParcel* parcel);
+	// user clicked play button in media transport controls
+
+	void stop();
+	// user clicked stop button in media transport controls
+
+	void pause();
+	void start();
+	// restart after pause - no need for all the setup
+
+	void focus(bool focus);
+
+	void seek(F32 time);
+	// jump to timecode time
+
+	LLPluginClassMediaOwner::EMediaStatus getStatus();
+	std::string getMimeType();
+	std::string getURL();
+	std::string getName();
+	viewer_media_t getParcelMedia();
+	bool hasParcelMedia() { return mMediaImpl.notNull(); }
+
+	static void parcelMediaCommandMessageHandler( LLMessageSystem *msg, void ** );
+	static void parcelMediaUpdateHandler( LLMessageSystem *msg, void ** );
+	void sendMediaNavigateMessage(const std::string& url);
+
+	// inherited from LLViewerMediaObserver
+	virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+
+private:
+	void processParcelMediaCommandMessage(LLMessageSystem *msg);
+	void processParcelMediaUpdate(LLMessageSystem *msg);
+
+	S32 mMediaParcelLocalID;
+	LLUUID mMediaRegionID;
+	// HACK: this will change with Media on a Prim
+	viewer_media_t mMediaImpl;
 };
 
 
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index 57ee583eae66f49fbf10669aa5313579165517f9..d38a434d6c126e53c15747eca6b3cac821c3b03a 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -122,7 +122,7 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
 		(mTimeInParcel > AUTOPLAY_TIME) &&		// and if we've been here for so many seconds
 		(!this_media_url.empty()) &&			// and if the parcel has media
 		(stricmp(this_media_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) &&
-		(LLViewerParcelMedia::sMediaImpl.isNull()))	// and if the media is not already playing
+		(!LLViewerParcelMedia::getInstance()->hasParcelMedia()))	// and if the media is not already playing
 	{
 		if (this_media_texture_id.notNull())	// and if the media texture is good
 		{
@@ -144,7 +144,7 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
 						if (gSavedSettings.getBOOL("ParcelMediaAutoPlayEnable"))
 						{
 							// and last but not least, only play when autoplay is enabled
-							LLViewerParcelMedia::play(this_parcel);
+							LLViewerParcelMedia::getInstance()->play(this_parcel);
 						}
 					}
 
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 416d5d8e2ef1bbca6dfd6d489adff5b6d37d4040..6cc88d0c0be698ba7956a4469ed5c94d464b0cd8 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -1822,7 +1822,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 	else
 	{
 		// Check for video
-		LLViewerParcelMedia::update(parcel);
+		LLViewerParcelMedia::getInstance()->update(parcel);
 
 		// Then check for music
 		if (gAudiop)