diff --git a/.hgtags b/.hgtags
index d48c328b8fabca3330f9f1aa892224679c9a4c57..e80cdf451ef60d2fba574b5ff92ee6d7a717b9bd 100644
--- a/.hgtags
+++ b/.hgtags
@@ -264,6 +264,7 @@ c6175c955a19e9b9353d242889ec1779b5762522 3.2.5-release
 16f8e2915f3f2e4d732fb3125daf229cb0fd1875 DRTVWR-114_3.2.8-beta1
 37dd400ad721e2a89ee820ffc1e7e433c68f3ca2 3.2.9-start
 16f8e2915f3f2e4d732fb3125daf229cb0fd1875 3.2.8-beta1
+089e5c84b2dece68f2b016c842ef9b5de4786842 DRTVWR-161
 987425b1acf4752379b2e1eb20944b4b35d67a85 DRTVWR-115_3.2.8-beta2
 987425b1acf4752379b2e1eb20944b4b35d67a85 3.2.8-beta2
 51b2fd52e36aab8f670e0874e7e1472434ec4b4a DRTVWR-113_3.2.8-release
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 47c43ec0380ecd8ace99bf3e2e5fadbaa264a1d4..ee2a760567f291073ec03eda3b13e203ad0b161c 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -624,6 +624,7 @@ Jonathan Yap
 	STORM-1799
 	STORM-1796
 	STORM-1807
+	STORM-1812
 	STORM-1820
 	STORM-1839
 	STORM-1842
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
index c01adc3c3562eb0c3deb2d9460c3ff51aa780ae8..a50d9074f7d9488e2742bfce5502ef672de48b72 100644
--- a/indra/newview/llpanelnearbymedia.cpp
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -176,7 +176,7 @@ void LLPanelNearByMedia::handleMediaAutoPlayChanged(const LLSD& newvalue)
 {
 	// update mParcelAudioAutoStart if AUTO_PLAY_MEDIA_SETTING changes
 	mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
-							gSavedSettings.getBOOL("MediaTentativeAutoPlay");							
+							gSavedSettings.getBOOL("MediaTentativeAutoPlay");
 }
 
 /*virtual*/
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 2447f5dea8da6928d025839d4ca183a53321af3f..8d8c401dac5044cc0c638c7e70597a3bed7d9376 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -41,6 +41,7 @@
 #include "llstartup.h"
 #include "llviewerparcelmgr.h"
 #include "llparcel.h"
+#include "llviewermessage.h"
 
 /////////////////////////////////////////////////////////
 
@@ -49,15 +50,22 @@ LLViewerAudio::LLViewerAudio() :
 	mFadeState(FADE_IDLE),
 	mFadeTime(),
     mIdleListnerActive(false),
-	mForcedTeleportFade(false)
+	mForcedTeleportFade(false),
+	mWasPlaying(false)
 {
 	mTeleportFailedConnection = LLViewerParcelMgr::getInstance()->
 		setTeleportFailedCallback(boost::bind(&LLViewerAudio::onTeleportFailed, this));
+	mTeleportFinishedConnection = LLViewerParcelMgr::getInstance()->
+		setTeleportFinishedCallback(boost::bind(&LLViewerAudio::onTeleportFinished, this, _1, _2));
+	mTeleportStartedConnection = LLViewerMessage::getInstance()->
+		setTeleportStartedCallback(boost::bind(&LLViewerAudio::onTeleportStarted, this));
 }
 
 LLViewerAudio::~LLViewerAudio()
 {
 	mTeleportFailedConnection.disconnect();
+	mTeleportFinishedConnection.disconnect();
+	mTeleportStartedConnection.disconnect();
 }
 
 void LLViewerAudio::registerIdleListener()
@@ -67,7 +75,6 @@ void LLViewerAudio::registerIdleListener()
 		mIdleListnerActive = true;
 		doOnIdleRepeating(boost::bind(boost::bind(&LLViewerAudio::onIdleUpdate, this)));
 	}
-
 }
 
 void LLViewerAudio::startInternetStreamWithAutoFade(std::string streamURI)
@@ -245,16 +252,54 @@ F32 LLViewerAudio::getFadeVolume()
 	return fade_volume;
 }
 
+void LLViewerAudio::onTeleportStarted()
+{
+	if (!LLViewerAudio::getInstance()->getForcedTeleportFade())
+	{
+		// Even though the music was turned off it was starting up (with autoplay disabled) occasionally
+		// after a failed teleport or after an intra-parcel teleport.  Also, the music sometimes was not
+		// restarting after a successful intra-parcel teleport. Setting mWasPlaying fixes these issues.
+		LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
+		LLViewerAudio::getInstance()->setForcedTeleportFade(true);
+		LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
+		LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
+	}
+}
+
 void LLViewerAudio::onTeleportFailed()
 {
-	if (gAudiop)
+	// Calling audio_update_volume makes sure that the music stream is properly set to be restored to
+	// its previous value
+	audio_update_volume(false);
+
+	if (gAudiop && mWasPlaying)
+	{
+		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+		if (parcel)
+		{
+			mNextStreamURI = parcel->getMusicURL();
+			llinfos << "Teleport failed -- setting music stream to " << mNextStreamURI << llendl;
+		}
+	}
+	mWasPlaying = false;
+}
+
+void LLViewerAudio::onTeleportFinished(const LLVector3d& pos, const bool& local)
+{
+	// Calling audio_update_volume makes sure that the music stream is properly set to be restored to
+	// its previous value
+	audio_update_volume(false);
+
+	if (gAudiop && local && mWasPlaying)
 	{
 		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
 		if (parcel)
 		{
 			mNextStreamURI = parcel->getMusicURL();
+			llinfos << "Intraparcel teleport -- setting music stream to " << mNextStreamURI << llendl;
 		}
 	}
+	mWasPlaying = false;
 }
 
 void init_audio() 
@@ -360,15 +405,9 @@ void audio_update_volume(bool force_update)
 	// Streaming Music
 	if (gAudiop) 
 	{
-		if (progress_view_visible  && !LLViewerAudio::getInstance()->getForcedTeleportFade())
-		{
-			LLViewerAudio::getInstance()->setForcedTeleportFade(true);
-			LLViewerAudio::getInstance()->startInternetStreamWithAutoFade(LLStringUtil::null);
-			LLViewerAudio::getInstance()->setNextStreamURI(LLStringUtil::null);
-		}
-
-		if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade() == true)
+		if (!progress_view_visible && LLViewerAudio::getInstance()->getForcedTeleportFade())
 		{
+			LLViewerAudio::getInstance()->setWasPlaying(!gAudiop->getInternetStreamURL().empty());
 			LLViewerAudio::getInstance()->setForcedTeleportFade(false);
 		}
 
diff --git a/indra/newview/llvieweraudio.h b/indra/newview/llvieweraudio.h
index a3da9fc6b8c12844d0df7995ba0ab696f3d2f187..8c302c65492456033c91401557c2474472321be9 100644
--- a/indra/newview/llvieweraudio.h
+++ b/indra/newview/llvieweraudio.h
@@ -66,6 +66,7 @@ class LLViewerAudio : public LLSingleton<LLViewerAudio>
 	bool getForcedTeleportFade() { return mForcedTeleportFade; };
 	void setForcedTeleportFade(bool fade) { mForcedTeleportFade = fade;} ;
 	void setNextStreamURI(std::string stream) { mNextStreamURI = stream; } ;
+	void setWasPlaying(bool playing) { mWasPlaying = playing;} ;
 
 private:
 
@@ -76,13 +77,17 @@ class LLViewerAudio : public LLSingleton<LLViewerAudio>
 	LLFrameTimer stream_fade_timer;
 	bool mIdleListnerActive;
 	bool mForcedTeleportFade;
+	bool mWasPlaying;
 	boost::signals2::connection	mTeleportFailedConnection;
+	boost::signals2::connection	mTeleportFinishedConnection;
+	boost::signals2::connection mTeleportStartedConnection;
 
 	void registerIdleListener();
 	void deregisterIdleListener() { mIdleListnerActive = false; };
 	void startFading();
 	void onTeleportFailed();
-
+	void onTeleportFinished(const LLVector3d& pos, const bool& local);
+	void onTeleportStarted();
 };
 
 #endif //LL_VIEWER_H
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a9bff67f40fed8589d8440abaec20e189d90e99f..1813611c355b46ce5f8414722bb77055e654af25 100755
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -3441,6 +3441,9 @@ void process_teleport_start(LLMessageSystem *msg, void**)
 
 	LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL;
 
+	// *NOTE: The server sends two StartTeleport packets when you are teleporting to a LM
+	LLViewerMessage::getInstance()->mTeleportStartedSignal();
+
 	if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
 	{
 		gViewerWindow->setProgressCancelButtonVisible(FALSE);
@@ -3460,11 +3463,17 @@ void process_teleport_start(LLMessageSystem *msg, void**)
 		make_ui_sound("UISndTeleportOut");
 		
 		LL_INFOS("Messaging") << "Teleport initiated by remote TeleportStart message with TeleportFlags: " <<  teleport_flags << LL_ENDL;
+
 		// Don't call LLFirstUse::useTeleport here because this could be
 		// due to being killed, which would send you home, not to a Telehub
 	}
 }
 
+boost::signals2::connection LLViewerMessage::setTeleportStartedCallback(teleport_started_callback_t cb)
+{
+	return mTeleportStartedSignal.connect(cb);
+}
+
 void process_teleport_progress(LLMessageSystem* msg, void**)
 {
 	LLUUID agent_id;
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 46bfb2dad06f614dd4c609e298392794e928404c..594c22ed9ca842a5d672e3c7a5c89f752d1c4f4b 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -37,6 +37,9 @@
 #include "llnotifications.h"
 #include "llextendedstatus.h"
 
+#include <boost/function.hpp>
+#include <boost/signals2.hpp>
+
 //
 // Forward declarations
 //
@@ -205,6 +208,15 @@ bool highlight_offered_object(const LLUUID& obj_id);
 void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
 void set_dad_inbox_object(const LLUUID& object_id);
 
+class LLViewerMessage : public  LLSingleton<LLViewerMessage>
+{
+public:
+	typedef boost::function<void()> teleport_started_callback_t;
+	typedef boost::signals2::signal<void()> teleport_started_signal_t;
+	boost::signals2::connection setTeleportStartedCallback(teleport_started_callback_t cb);
+
+	teleport_started_signal_t	mTeleportStartedSignal;
+};
 
 class LLOfferInfo : public LLNotificationResponderInterface
 {
@@ -253,5 +265,3 @@ class LLOfferInfo : public LLNotificationResponderInterface
 void process_feature_disabled_message(LLMessageSystem* msg, void**);
 
 #endif
-
-
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index 9db784101d9c3dd8e0aabd8fb927d8f435a0418d..ae9c31bfe77bae83a644aeb2ed0eb67537a91860 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -82,7 +82,6 @@ LLPointer<LLViewerTexture> sBlockedImage;
 LLPointer<LLViewerTexture> sPassImage;
 
 // Local functions
-void optionally_start_music(const std::string& music_url);
 void callback_start_music(S32 option, void* data);
 void optionally_prepare_video(const LLParcel *parcelp);
 void callback_prepare_video(S32 option, void* data);
@@ -1589,7 +1588,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 			if (instance->mTeleportInProgress)
 			{
 				instance->mTeleportInProgress = FALSE;
-				instance->mTeleportFinishedSignal(gAgent.getPositionGlobal());
+				instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false);
 			}
 		}
 	}
@@ -1773,13 +1772,13 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
 	};
 }
 
-void optionally_start_music(const std::string& music_url)
+void LLViewerParcelMgr::optionally_start_music(const std::string& music_url)
 {
 	if (gSavedSettings.getBOOL("AudioStreamingMusic"))
 	{
 		// only play music when you enter a new parcel if the UI control for this
 		// was not *explicitly* stopped by the user. (part of SL-4878)
-		LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();;
+		LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();
 		if ((nearby_media_panel &&
 		     nearby_media_panel->getParcelAudioAutoStart()) ||
 		    // or they have expressed no opinion in the UI, but have autoplay on...
@@ -2559,7 +2558,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos
 	{
 		// Local teleport. We already have the agent parcel data.
 		// Emit the signal immediately.
-		getInstance()->mTeleportFinishedSignal(new_pos);
+		getInstance()->mTeleportFinishedSignal(new_pos, local);
 	}
 	else
 	{
diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h
index cac8d8391cfac364cd59a707112c952a3d6eda7a..2a115494266b419a0d19a6f9d8adc065c0e560cd 100644
--- a/indra/newview/llviewerparcelmgr.h
+++ b/indra/newview/llviewerparcelmgr.h
@@ -78,8 +78,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 {
 
 public:
-	typedef boost::function<void (const LLVector3d&)> teleport_finished_callback_t;
-	typedef boost::signals2::signal<void (const LLVector3d&)> teleport_finished_signal_t;
+	typedef boost::function<void (const LLVector3d&, const bool& local)> teleport_finished_callback_t;
+	typedef boost::signals2::signal<void (const LLVector3d&, const bool&)> teleport_finished_signal_t;
 	typedef boost::function<void()> parcel_changed_callback_t;
 	typedef boost::signals2::signal<void()> parcel_changed_signal_t;
 
@@ -275,6 +275,8 @@ class LLViewerParcelMgr : public LLSingleton<LLViewerParcelMgr>
 	// *NOTE: Taken out 2005-03-21. Phoenix.
 	//void makeLandmarkAtSelection();
 
+	static void optionally_start_music(const std::string& music_url);
+
 	static void processParcelOverlay(LLMessageSystem *msg, void **user_data);
 	static void processParcelProperties(LLMessageSystem *msg, void **user_data);
 	static void processParcelAccessListReply(LLMessageSystem *msg, void **user);