diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp
index bfcc2ea124cebd187fa7f63dde9218e178b32fc8..9eebe84d711cd27513fed67dd13d2b44efb87b9d 100644
--- a/indra/llaudio/llaudioengine_fmodstudio.cpp
+++ b/indra/llaudio/llaudioengine_fmodstudio.cpp
@@ -486,7 +486,6 @@ bool LLAudioChannelFMODSTUDIO::updateBuffer()
 	// If we have a source for the channel, we need to update its gain.
 	if (mCurrentSourcep)
 	{
-		// SJB: warnings can spam and hurt framerate, disabling
 		//FMOD_RESULT result;
 
 		mChannelp->setVolume(getSecondaryGain() * mCurrentSourcep->getGain());
@@ -677,7 +676,7 @@ bool LLAudioBufferFMODSTUDIO::loadWAV(const std::string& filename)
 		mSoundp = NULL;
 	}
 
-	FMOD_MODE base_mode = FMOD_LOOP_NORMAL | FMOD_SOFTWARE;
+	FMOD_MODE base_mode = FMOD_LOOP_NORMAL;
 	FMOD_CREATESOUNDEXINFO exinfo;
 	memset(&exinfo,0,sizeof(exinfo));
 	exinfo.cbsize = sizeof(exinfo);
diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
index 5110cd380640476849271d79fc260dcd651f17c5..d8833e114cd6f9ae6ce805ca992e5dc2e70cf506 100644
--- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp
+++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp
@@ -100,9 +100,17 @@ void LLStreamingAudio_FMODSTUDIO::start(const std::string& url)
 
 	if (!url.empty())
 	{
-		LL_INFOS() << "Starting internet stream: " << url << LL_ENDL;
-		mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,url);
-		mURL = url;
+		if(mDeadStreams.empty())
+		{
+			LL_INFOS() << "Starting internet stream: " << url << LL_ENDL;
+			mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,url);
+			mURL = url;
+		}
+		else
+		{
+			LL_INFOS() << "Deferring stream load until buffer release: " << url << LL_ENDL;
+			mPendingURL = url;
+		}
 	}
 	else
 	{
@@ -131,6 +139,21 @@ void LLStreamingAudio_FMODSTUDIO::update()
 		}
 	}
 
+	if(!mDeadStreams.empty())
+	{
+		llassert_always(mCurrentInternetStreamp == NULL);
+		return;
+	}
+
+	if(!mPendingURL.empty())
+	{
+		llassert_always(mCurrentInternetStreamp == NULL);
+		llinfos << "Starting internet stream: " << mPendingURL << LL_ENDL;
+		mCurrentInternetStreamp = new LLAudioStreamManagerFMODSTUDIO(mSystem,mPendingURL);
+		mURL = mPendingURL;
+		mPendingURL.clear();
+	}
+
 	// Don't do anything if there are no streams playing
 	if (!mCurrentInternetStreamp)
 	{
@@ -211,6 +234,8 @@ void LLStreamingAudio_FMODSTUDIO::update()
 
 void LLStreamingAudio_FMODSTUDIO::stop()
 {
+	mPendingURL.clear();
+
 	if (mFMODInternetStreamChannelp)
 	{
 		mFMODInternetStreamChannelp->setPaused(true);
@@ -264,7 +289,7 @@ int LLStreamingAudio_FMODSTUDIO::isPlaying()
 	{
 		return 1; // Active and playing
 	}
-	else if (!mURL.empty())
+	else if (!mURL.empty() || !mPendingURL.empty())
 	{
 		return 2; // "Paused"
 	}
@@ -344,8 +369,6 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream()
 {
 	if (mInternetStream)
 	{
-
-
 		bool close = true;
 		switch (getOpenState())
 		{
@@ -356,9 +379,8 @@ bool LLAudioStreamManagerFMODSTUDIO::stopStream()
 			close = true;
 		}
 
-		if (close)
+		if (close && mInternetStream->release() == FMOD_OK)
 		{
-			mInternetStream->release();
 			mStreamChannel = NULL;
 			mInternetStream = NULL;
 			return true;
diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.h b/indra/llaudio/llstreamingaudio_fmodstudio.h
index 4ed797c7421fabff6335c9fa5c344ba9ec67f2b5..5e1a6a373ca280bb042ef9651f8aa962a355f0f9 100644
--- a/indra/llaudio/llstreamingaudio_fmodstudio.h
+++ b/indra/llaudio/llstreamingaudio_fmodstudio.h
@@ -66,6 +66,7 @@ private:
 	std::list<LLAudioStreamManagerFMODSTUDIO *> mDeadStreams;
 
 	std::string mURL;
+	std::string mPendingURL;
 	F32 mGain;
 };