diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index ee09625890e3934b51688b7cbedd2b09161f5067..2a774d54a3a0ab044bddfda8f698d6e812c77422 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -77,6 +77,7 @@ std::list<std::string> gUntranslated;
 /*static*/ LLUI::settings_map_t LLUI::sSettingGroups;
 /*static*/ LLImageProviderInterface* LLUI::sImageProvider = NULL;
 /*static*/ LLUIAudioCallback LLUI::sAudioCallback = NULL;
+/*static*/ LLUIAudioCallback LLUI::sDeferredAudioCallback = NULL;
 /*static*/ LLVector2		LLUI::sGLScaleFactor(1.f, 1.f);
 /*static*/ LLWindow*		LLUI::sWindow = NULL;
 /*static*/ LLView*			LLUI::sRootView = NULL;
@@ -101,16 +102,18 @@ static LLDefaultChildRegistry::Register<LLToolBar> register_toolbar("toolbar");
 //
 // Functions
 //
-void make_ui_sound(const char* namep)
+
+LLUUID find_ui_sound(const char * namep)
 {
 	std::string name = ll_safe_string(namep);
+	LLUUID uuid = LLUUID(NULL);
 	if (!LLUI::sSettingGroups["config"]->controlExists(name))
 	{
 		llwarns << "tried to make UI sound for unknown sound name: " << name << llendl;	
 	}
 	else
 	{
-		LLUUID uuid(LLUI::sSettingGroups["config"]->getString(name));
+		uuid = LLUUID(LLUI::sSettingGroups["config"]->getString(name));
 		if (uuid.isNull())
 		{
 			if (LLUI::sSettingGroups["config"]->getString(name) == LLUUID::null.asString())
@@ -124,7 +127,6 @@ void make_ui_sound(const char* namep)
 			{
 				llwarns << "UI sound named: " << name << " does not translate to a valid uuid" << llendl;	
 			}
-
 		}
 		else if (LLUI::sAudioCallback != NULL)
 		{
@@ -132,9 +134,28 @@ void make_ui_sound(const char* namep)
 			{
 				llinfos << "UI sound name: " << name << llendl;	
 			}
-			LLUI::sAudioCallback(uuid);
 		}
 	}
+
+	return uuid;
+}
+
+void make_ui_sound(const char* namep)
+{
+	LLUUID soundUUID = find_ui_sound(namep);
+	if(soundUUID.notNull())
+	{
+		LLUI::sAudioCallback(soundUUID);
+	}
+}
+
+void make_ui_sound_deferred(const char* namep)
+{
+	LLUUID soundUUID = find_ui_sound(namep);
+	if(soundUUID.notNull())
+	{
+		LLUI::sDeferredAudioCallback(soundUUID);
+	}
 }
 
 BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom)
@@ -1608,6 +1629,7 @@ void gl_segmented_rect_3d_tex(const LLRectf& clip_rect, const LLRectf& center_uv
 void LLUI::initClass(const settings_map_t& settings,
 					 LLImageProviderInterface* image_provider,
 					 LLUIAudioCallback audio_callback,
+					 LLUIAudioCallback deferred_audio_callback,
 					 const LLVector2* scale_factor,
 					 const std::string& language)
 {
@@ -1622,6 +1644,7 @@ void LLUI::initClass(const settings_map_t& settings,
 
 	sImageProvider = image_provider;
 	sAudioCallback = audio_callback;
+	sDeferredAudioCallback = deferred_audio_callback;
 	sGLScaleFactor = (scale_factor == NULL) ? LLVector2(1.f, 1.f) : *scale_factor;
 	sWindow = NULL; // set later in startup
 	LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow");
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index e54cae1d78dab26428d1e8faf804d9d51d7fed5f..4c1703392a14a5d44333d3daa21693b54dd86511 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -62,6 +62,7 @@ class LLHelp;
 // UI colors
 extern const LLColor4 UI_VERTEX_COLOR;
 void make_ui_sound(const char* name);
+void make_ui_sound_deferred(const char * name);
 
 BOOL ui_point_in_rect(S32 x, S32 y, S32 left, S32 top, S32 right, S32 bottom);
 void gl_state_for_2d(S32 width, S32 height);
@@ -274,6 +275,7 @@ class LLUI
 	static void initClass(const settings_map_t& settings,
 						  LLImageProviderInterface* image_provider,
 						  LLUIAudioCallback audio_callback = NULL,
+						  LLUIAudioCallback deferred_audio_callback = NULL,
 						  const LLVector2 *scale_factor = NULL,
 						  const std::string& language = LLStringUtil::null);
 	static void cleanupClass();
@@ -359,6 +361,7 @@ class LLUI
 	//
 	static settings_map_t sSettingGroups;
 	static LLUIAudioCallback sAudioCallback;
+	static LLUIAudioCallback sDeferredAudioCallback;
 	static LLVector2		sGLScaleFactor;
 	static LLWindow*		sWindow;
 	static LLView*			sRootView;
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index d40537fc78a82ffeaf5fc9929c32b233d73c06a8..bd4cdac5f2675dc91dff83daeb71decd05db7784 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -151,6 +151,7 @@ set(viewer_SOURCE_FILES
     lldaycyclemanager.cpp
     lldebugmessagebox.cpp
     lldebugview.cpp
+    lldeferredsounds.cpp
     lldelayedgestureerror.cpp
     lldirpicker.cpp
     lldonotdisturbnotificationstorage.cpp
@@ -739,6 +740,7 @@ set(viewer_HEADER_FILES
     lldaycyclemanager.h
     lldebugmessagebox.h
     lldebugview.h
+    lldeferredsounds.h
     lldelayedgestureerror.h
     lldirpicker.h
     lldonotdisturbnotificationstorage.h
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3c42734e6e06d107c6a170014588db9fc343d2ad..a291fac5a148a17e98052cd1e8047a7a9c8e1047 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -201,6 +201,7 @@
 #include "llviewercontrol.h"
 #include "lleventnotifier.h"
 #include "llcallbacklist.h"
+#include "lldeferredsounds.h"
 #include "pipeline.h"
 #include "llgesturemgr.h"
 #include "llsky.h"
@@ -220,6 +221,7 @@
 #include "llmachineid.h"
 #include "llmainlooprepeater.h"
 
+#include <queue>
 
 // *FIX: These extern globals should be cleaned up.
 // The globals either represent state/config/resource-storage of either 
@@ -456,7 +458,7 @@ void idle_afk_check()
 }
 
 // A callback set in LLAppViewer::init()
-static void ui_audio_callback(const LLUUID& uuid)
+void ui_audio_callback(const LLUUID& uuid)
 {
 	if (gAudiop)
 	{
@@ -464,6 +466,15 @@ static void ui_audio_callback(const LLUUID& uuid)
 	}
 }
 
+// A callback set in LLAppViewer::init()
+static void deferred_ui_audio_callback(const LLUUID& uuid)
+{
+	if (gAudiop)
+	{
+		LLDeferredSounds::instance().deferSound(uuid);
+	}
+}
+
 bool	create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base)
 {
 	if(!match || !base || base->getPlainText())
@@ -778,6 +789,7 @@ bool LLAppViewer::init()
 	LLUI::initClass(settings_map,
 		LLUIImageList::getInstance(),
 		ui_audio_callback,
+		deferred_ui_audio_callback,
 		&LLUI::sGLScaleFactor);
 	LL_INFOS("InitInfo") << "UI initialized." << LL_ENDL ;
 
diff --git a/indra/newview/lldeferredsounds.cpp b/indra/newview/lldeferredsounds.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2b2b493875e5e6bc487d5ed202d8fc17ee04f0d2
--- /dev/null
+++ b/indra/newview/lldeferredsounds.cpp
@@ -0,0 +1,45 @@
+/** 
+* @file lldeferredsounds.cpp
+* @brief Implementation of lldeferredsounds
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldeferredsounds.h"
+
+void ui_audio_callback(const LLUUID& uuid);
+
+void LLDeferredSounds::deferSound(LLUUID sound)
+{
+	soundQueue.push(sound);
+}
+void LLDeferredSounds::playdeferredSounds()
+{
+	while(soundQueue.size())
+	{
+		ui_audio_callback(soundQueue.front());
+		soundQueue.pop();
+	}
+}
diff --git a/indra/newview/lldeferredsounds.h b/indra/newview/lldeferredsounds.h
new file mode 100644
index 0000000000000000000000000000000000000000..50da9acf2b2b41c656abf2e7a1ac68c4cba457ff
--- /dev/null
+++ b/indra/newview/lldeferredsounds.h
@@ -0,0 +1,44 @@
+/** 
+* @file   lldeferredsounds.h
+* @brief  Header file for lldeferredsounds
+* @author Gilbert@lindenlab.com
+*
+* $LicenseInfo:firstyear=2013&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2013, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
+* $/LicenseInfo$
+*/
+#ifndef LL_LLDEFERREDSOUNDS_H
+#define LL_LLDEFERREDSOUNDS_H
+
+#include "llsingleton.h"
+
+class LLDeferredSounds : public LLSingleton<LLDeferredSounds>
+{
+private:
+	std::queue<LLUUID> soundQueue;
+public:
+	//Add sounds to be played once progress bar is hidden (such as after teleport or loading screen)
+	void deferSound(LLUUID sound);
+
+	void playdeferredSounds();
+};
+
+#endif // LL_LLDEFERREDSOUNDS_H
+
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 15c42e828502a3db436b56398bee072ab376e182..6e39d049a519f31570ff4b70359463d0e970d1ad 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -146,6 +146,7 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
 	
 	LLNotifications& instance = LLNotifications::instance();
     bool imToastExists = false;
+    bool offerExists = false;
 	
 	for (LLSD::array_const_iterator notification_it = data.beginArray();
 		 notification_it != data.endArray();
@@ -160,6 +161,10 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
         {
             imToastExists = true;
         }
+        else if(notificationName == offerName)
+        {
+            offerExists = true;
+        }
 
         //New notification needs to be added
         notification = (LLNotificationPtr) new LLNotification(notification_params.with("is_dnd", true));
@@ -183,6 +188,11 @@ void LLDoNotDisturbNotificationStorage::loadNotifications()
         LLFloaterReg::showInstance("im_container");
     }
 
+    if(imToastExists || offerExists)
+    {
+		make_ui_sound_deferred("UISndNewIncomingIMSession");
+    }
+
     //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty)
 	saveNotifications();
 }
@@ -196,6 +206,7 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()
 
     LLNotifications& instance = LLNotifications::instance();
     bool imToastExists = false;
+    bool offerExists = false;
   
     for (LLCommunicationChannel::history_list_t::const_iterator it = commChannel->beginHistory();
         it != commChannel->endHistory();
@@ -208,6 +219,10 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()
         {
             imToastExists = true;
         }
+        else if(notificationName == offerName)
+        {
+            offerExists = true;
+        }
 
         //Notification already exists in notification pipeline (same instance of app running)
         if (notification)
@@ -222,6 +237,11 @@ void LLDoNotDisturbNotificationStorage::updateNotifications()
         LLFloaterReg::showInstance("im_container");
     }
 
+    if(imToastExists || offerExists)
+    {
+        make_ui_sound("UISndNewIncomingIMSession");
+    }
+
     //When exit DND mode, write empty notifications file
     if(commChannel->getHistorySize())
     {
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index da38c9063be2613ae4ec2d916c7e76ec078db0d2..cde7bb18cededdae60d08cd93ecdded809a6240d 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -120,7 +120,8 @@ bool LLOfferHandler::processNotification(const LLNotificationPtr& notification)
 				channel->addToast(p);
 
             //Will not play a notification sound for inventory and teleport offer based upon chat preference
-            bool playSound = !((notification->getName() == "UserGiveItem"
+            bool playSound = !((notification->isDND())
+                               && (notification->getName() == "UserGiveItem"
                                     && gSavedSettings.getBOOL("PlaySoundInventoryOffer") == FALSE)
                                 ||  notification->getName() == "TeleportOffered"
                                     && gSavedSettings.getBOOL("PlaySoundTeleportOffer") == FALSE);
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index f86e583b9e23ccf8543e4181f5e5636840465aca..989f0b0e6056a4cc7448a1f73d10dc74cdc732cc 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -96,7 +96,7 @@ BOOL LLProgressView::postBuild()
 	getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this);
 
 	// hidden initially, until we need it
-	LLPanel::setVisible(FALSE);
+	setVisible(FALSE);
 
 	LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1));
 
@@ -265,7 +265,7 @@ void LLProgressView::draw()
 			gFocusMgr.releaseFocusIfNeeded( this );
 
 			// turn off panel that hosts intro so we see the world
-			LLPanel::setVisible(FALSE);
+			setVisible(FALSE);
 
 			// stop observing events since we no longer care
 			mMediaCtrl->remObserver( this );
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 8d8c401dac5044cc0c638c7e70597a3bed7d9376..564bf7997af99bff88eb4736b613f4df273c3759 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -30,6 +30,7 @@
 #include "llagent.h"
 #include "llagentcamera.h"
 #include "llappviewer.h"
+#include "lldeferredsounds.h"
 #include "llvieweraudio.h"
 #include "llviewercamera.h"
 #include "llviewercontrol.h"
@@ -388,6 +389,12 @@ void audio_update_volume(bool force_update)
 		gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff"));
 		gAudiop->setMuted(mute_audio || progress_view_visible);
 		
+		//Play any deferred sounds when unmuted
+		if(!gAudiop->getMuted())
+		{
+			LLDeferredSounds::instance().playdeferredSounds();
+		}
+
 		if (force_update)
 		{
 			audio_update_wind(true);