diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index b159092592bac2022512dfaa82b3ffa793225c44..1f578eec5fd90c3a571ef6c3bbb25125f5a82630 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -119,14 +119,14 @@ if (LINUX)
   endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
 
   # Let's actually get a numerical version of gxx's version
-  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION})
+  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
 
-  # gcc 4.3 and above don't like the LL boost and also 
+  # gcc 4.3 and above don't like the LL boost and also
   # cause warnings due to our use of deprecated headers
-  if(${CXX_VERSION} GREATER 429)
+  if(${CXX_VERSION_NUMBER} GREATER 429)
     add_definitions(-Wno-parentheses)
     set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
-  endif (${CXX_VERSION} GREATER 429)
+  endif (${CXX_VERSION_NUMBER} GREATER 429)
 
   # End of hacks.
 
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index bbf31f92972b1c8f4c8664f0a69b70964882fc2e..342accad7abbd0a783c47430a863688b0314fdeb 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -19,10 +19,12 @@ if(WINDOWS)
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
     set(vivox_files
         SLVoice.exe
-        alut.dll
+	libsndfile-1.dll
+        vivoxplatform.dll
         vivoxsdk.dll
         ortp.dll
-        wrap_oal.dll
+        zlib1.dll
+        vivoxoal.dll
         )
 
     #*******************************
@@ -139,9 +141,10 @@ elseif(DARWIN)
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
     set(vivox_files
         SLVoice
-        libalut.dylib
-        libopenal.dylib
+        libsndfile.dylib
+        libvivoxoal.dylib
         libortp.dylib
+        libvivoxplatform.dylib
         libvivoxsdk.dylib
        )
     # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
@@ -190,9 +193,10 @@ elseif(LINUX)
 
     set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
     set(vivox_files
-        libalut.so
-        libopenal.so.1
+        libsndfile.so.1
         libortp.so
+        libvivoxoal.so.1
+        libvivoxplatform.so
         libvivoxsdk.so
         SLVoice
        )
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index fff78ecbe330e1ecabcde00276c154ae37407eff..0f6967e42a13af15ca9ec0180904501323e0c848 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -64,20 +64,20 @@ def main(command, libpath=[], vars={}):
         # might not exist; instead of KeyError, just use an empty string.
         dirs = os.environ.get(var, "").split(os.pathsep)
         # Append the sequence in libpath
-##         print "%s += %r" % (var, libpath)
+        print "%s += %r" % (var, libpath)
         dirs.extend(libpath)
         # Now rebuild the path string. This way we use a minimum of separators
         # -- and we avoid adding a pointless separator when libpath is empty.
         os.environ[var] = os.pathsep.join(dirs)
     # Now handle arbitrary environment variables. The tricky part is ensuring
     # that all the keys and values we try to pass are actually strings.
-##     if vars:
-##         print "Setting:"
-##         for key, value in vars.iteritems():
-##             print "%s=%s" % (key, value)
+    if vars:
+         print "Setting:"
+         for key, value in vars.iteritems():
+             print "%s=%s" % (key, value)
     os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
     # Run the child process.
-##     print "Running: %s" % " ".join(command)
+    print "Running: %s" % " ".join(command)
     return subprocess.call(command)
 
 if __name__ == "__main__":
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 9e9e1aaeaecf4121ef51793b30ee500c6f59d580..bfa2c34c12808666a64ccfe8523c4b2f8535c630 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES
     llaudioengine.cpp
     lllistener.cpp
     llaudiodecodemgr.cpp
-    llvorbisdecode.cpp
     llvorbisencode.cpp
     )
 
@@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES
     llaudioengine.h
     lllistener.h
     llaudiodecodemgr.h
-    llvorbisdecode.h
     llvorbisencode.h
     llwindgen.h
     )
@@ -60,11 +58,11 @@ if (FMOD)
          )
 
     if (LINUX)
-      if (${CXX_VERSION} MATCHES "4.[23]")
+      if (${CXX_VERSION_NUMBER} GREATER 419)
         set_source_files_properties(llaudioengine_fmod.cpp
                                     llstreamingaudio_fmod.cpp
                                     COMPILE_FLAGS -Wno-write-strings)
-      endif (${CXX_VERSION} MATCHES "4.[23]")
+      endif (${CXX_VERSION_NUMBER} GREATER 419)
     endif (LINUX)
 endif (FMOD)
 
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index ae959eaa81b8ffeef3d27b29c6eeff195daa513b..6bbaad9cefad1b16ece7427be04f199e0fce0f7f 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,7 +33,6 @@
 
 #include "llaudiodecodemgr.h"
 
-#include "llvorbisdecode.h"
 #include "llaudioengine.h"
 #include "lllfsthread.h"
 #include "llvfile.h"
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index c3d8a5aa23632c487863b59de1da3ef45b64d325..70d770ef7ed6d99cdafd183b9198f8cef051f95f 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -2,6 +2,7 @@
  * @file llpluginclassmedia.cpp
  * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index dcc4a3bd6a257c6e1993f1372b083f7e6c3a0de8..6b6468871841a88e8353b91b4fc40f439534ae3b 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -2,6 +2,7 @@
  * @file llpluginclassmedia.h
  * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINCLASSMEDIA_H
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index c798af29caf1e1c3e9a742f21f70ff1060bbf1ec..6d369cd51a36a57e3a129dde9b91b21c517e5abd 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -2,6 +2,7 @@
  * @file llpluginclassmediaowner.h
  * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index 58fb792d0d12c0c7380dad65beec8b28bf575a1e..16ba49266915792f24227c534f5d01a7399d41cc 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -2,6 +2,7 @@
  * @file llplugininstance.cpp
  * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index ba569df10c2c08bfa288e79d5c519f1d7b9e67a1..02936f65fbf20afaabdbe79538505c39e996766d 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -2,6 +2,7 @@
  * @file llplugininstance.h
  * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGININSTANCE_H
diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp
index 32601b47dbbc63035e09255f18c04ae9f84593c5..34e02c356ea58ab80bb293148f01270eb2f1ee35 100644
--- a/indra/llplugin/llpluginmessage.cpp
+++ b/indra/llplugin/llpluginmessage.cpp
@@ -2,6 +2,7 @@
  * @file llpluginmessage.cpp
  * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h
index 5e93d8b7a1cf485b1cac97fded668fd85165a413..99f8d1194f7bac6c8d4a1d8ac426725b0bcc5754 100644
--- a/indra/llplugin/llpluginmessage.h
+++ b/indra/llplugin/llpluginmessage.h
@@ -2,6 +2,7 @@
  * @file llpluginmessage.h
  * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINMESSAGE_H
diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h
index 927fcf2eb2c38bdada1a14ee772f1a4f714e8229..01fddb92c5cf05d34a1b798b1d5ea7e889e65714 100644
--- a/indra/llplugin/llpluginmessageclasses.h
+++ b/indra/llplugin/llpluginmessageclasses.h
@@ -2,6 +2,7 @@
  * @file llpluginmessageclasses.h
  * @brief This file defines the versions of existing message classes for LLPluginMessage.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINMESSAGECLASSES_H
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 31ea1389124816e0b4f7018ced4aac5edb4273f1..cc193fca4210c1c8997534a3a86c72fc83b33841 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -2,6 +2,7 @@
  * @file llpluginmessagepipe.cpp
  * @brief Classes that implement connections from the plugin system to pipes/pumps.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 4eb6575bd4f343706b2ae4f57f85bae103543ffe..1ddb38de6883f63b6e7e090b6ff3c77be0b25d6d 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -2,6 +2,7 @@
  * @file llpluginmessagepipe.h
  * @brief Classes that implement connections from the plugin system to pipes/pumps.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINMESSAGEPIPE_H
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index fc95136d9e39b189ec61c035af1cb9122c590903..55cf11c6208805cca7e72d15ea28c4ec4c13d2f2 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -2,6 +2,7 @@
  * @file llpluginprocesschild.cpp
  * @brief LLPluginProcessChild handles the child side of the external-process plugin API. 
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 75860bdf0a9c4fec86834e1e776b1c4173f8b761..f5c57c3d49d212257723d33a208e3d15bd8ddf22 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -2,6 +2,7 @@
  * @file llpluginprocesschild.h
  * @brief LLPluginProcessChild handles the child side of the external-process plugin API. 
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINPROCESSCHILD_H
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index b7ce800c3aba27263f479d1f0255cd72147192be..332ce288d70207292d2ef16ed3ce7c0e331799b9 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -2,6 +2,7 @@
  * @file llpluginprocessparent.cpp
  * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 1289e86c1365521be3ecea831ab895c9ce1303a9..25669f5d78eddb2d9a100809bb5558b30bee8a89 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -2,6 +2,7 @@
  * @file llpluginprocessparent.h
  * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp
index ce8b8e3e09034a481c0943350e878ab749452c10..3c69a69d28a8e480fe5fa08675819af6da363b43 100644
--- a/indra/llplugin/llpluginsharedmemory.cpp
+++ b/indra/llplugin/llpluginsharedmemory.cpp
@@ -2,6 +2,7 @@
  * @file llpluginsharedmemory.cpp
  * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h
index a4613b9a54797f62811407a832f78d940a93c953..4014620c520edc7ef0b35b6c7fda902567b14b6f 100644
--- a/indra/llplugin/llpluginsharedmemory.h
+++ b/indra/llplugin/llpluginsharedmemory.h
@@ -2,6 +2,7 @@
  * @file llpluginsharedmemory.h
  * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef LL_LLPLUGINSHAREDMEMORY_H
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 005e427572357182d2fdbeb24a56401a17c3d12d..23dc532ba56eeeec47d1e4691cf160cbea886a05 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -1,11 +1,13 @@
-/** 
+/**
  * @file slplugin.cpp
  * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
  *
+ * @cond
+ *
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
- * 
+ *
  * Second Life Viewer Source Code
  * The source code in this file ("Source Code") is provided by Linden Lab
  * to you under the terms of the GNU General Public License, version 2.0
@@ -13,20 +15,22 @@
  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  * online at http://secondlife.com/developers/opensource/gplv2
- * 
+ *
  * There are special exceptions to the terms and conditions of the GPL as
  * it is applied to this Source Code. View the full text of the exception
  * in the file doc/FLOSS-exception.txt in this software distribution, or
  * online at http://secondlife.com/developers/opensource/flossexception
- * 
+ *
  * By copying, modifying or distributing this software, you acknowledge
  * that you have read and understood your obligations described above,
  * and agree to abide by those obligations.
- * 
+ *
  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ *
+ * @endcond
  */
 
 
@@ -48,15 +52,15 @@
 
 /*
 	On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
-	
+
 	Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
-	
+
 	-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
-	
+
 	which means adding this to the gcc flags:
-	
+
 	-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-	
+
 */
 
 #if LL_DARWIN || LL_LINUX
@@ -67,7 +71,7 @@ static void crash_handler(int sig)
 	// TODO: add our own crash reporting
 	_exit(1);
 }
-#endif	
+#endif
 
 #if LL_WINDOWS
 #include <windows.h>
@@ -80,7 +84,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
 	//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
 
 	// TODO: replace exception handler before we exit?
-	return EXCEPTION_EXECUTE_HANDLER;	
+	return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+	LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+	return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+//          It should work for any flavor of 32-bit Windows we care about.
+//          If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+	HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+	if ( NULL == hKernel32 )
+		return FALSE;
+
+	void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+	if( NULL == pOrgEntry )
+		return FALSE;
+
+	unsigned char newJump[ 100 ];
+	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+	void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+	DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+	newJump[ 0 ] = 0xE9;  // JMP absolute
+	memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+	SIZE_T bytesWritten;
+	BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+	return bRet;
+#else
+	return FALSE;
+#endif
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -91,6 +136,7 @@ void initExceptionHandler()
 
 	// save old exception handler in case we need to restore it at the end
 	prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+	PreventSetUnhandledExceptionFilter();
 }
 
 bool checkExceptionHandler()
@@ -99,6 +145,8 @@ bool checkExceptionHandler()
 	LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
 	prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
 
+	PreventSetUnhandledExceptionFilter();
+
 	if (prev_filter != myWin32ExceptionHandler)
 	{
 		LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
@@ -122,7 +170,7 @@ bool checkExceptionHandler()
 }
 #endif
 
-// If this application on Windows platform is a console application, a console is always 
+// If this application on Windows platform is a console application, a console is always
 // created which is bad. Making it a Windows "application" via CMake settings but not
 // adding any code to explicitly create windows does the right thing.
 #if LL_WINDOWS
@@ -133,7 +181,7 @@ int main(int argc, char **argv)
 {
 	ll_init_apr();
 
-	// Set up llerror logging 
+	// Set up llerror logging
 	{
 		LLError::initForApplication(".");
 		LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -146,14 +194,14 @@ int main(int argc, char **argv)
 	{
 		LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
 	};
-	
+
 	U32 port = 0;
 	if(!LLStringUtil::convertToU32(lpCmdLine, port))
 	{
 		LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
 	};
 
-	// Insert our exception handler into the system so this plugin doesn't 
+	// Insert our exception handler into the system so this plugin doesn't
 	// display a crash message if something bad happens. The host app will
 	// see the missing heartbeat and log appropriately.
 	initExceptionHandler();
@@ -162,7 +210,7 @@ int main(int argc, char **argv)
 	{
 		LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
 	}
-	
+
 	U32 port = 0;
 	if(!LLStringUtil::convertToU32(argv[1], port))
 	{
@@ -183,17 +231,17 @@ int main(int argc, char **argv)
 	LLPluginProcessChild *plugin = new LLPluginProcessChild();
 
 	plugin->init(port);
-	
+
 	LLTimer timer;
 	timer.start();
 
 #if LL_WINDOWS
 	checkExceptionHandler();
 #endif
-		
+
 	while(!plugin->isDone())
 	{
-		timer.reset();	
+		timer.reset();
 		plugin->idle();
 #if LL_DARWIN
 		{
@@ -204,7 +252,7 @@ int main(int argc, char **argv)
 #endif
 		F64 elapsed = timer.getElapsedTimeF64();
 		F64 remaining = plugin->getSleepTime() - elapsed;
-		
+
 		if(remaining <= 0.0f)
 		{
 			// We've already used our full allotment.
@@ -217,26 +265,26 @@ int main(int argc, char **argv)
 		{
 
 //			LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
-//			timer.reset();	
-			
+//			timer.reset();
+
 			// This also services the network as needed.
 			plugin->sleep(remaining);
-			
+
 //			LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" <<  LL_ENDL;
 		}
 
 #if LL_WINDOWS
 	// More agressive checking of interfering exception handlers.
-	// Doesn't appear to be required so far - even for plugins 
-	// that do crash with a single call to the intercept 
+	// Doesn't appear to be required so far - even for plugins
+	// that do crash with a single call to the intercept
 	// exception handler such as QuickTime.
 	//checkExceptionHandler();
 #endif
 	}
 
 	delete plugin;
-	
-	ll_cleanup_apr();	
+
+	ll_cleanup_apr();
 
 	return 0;
 }
diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp
index bab5cfd56edf1251bf2361e9d1f4341a9d0fca90..d9520b3bf63c1f226bb65244bb50904b4a51ee2f 100644
--- a/indra/llrender/llrendertarget.cpp
+++ b/indra/llrender/llrendertarget.cpp
@@ -61,11 +61,8 @@ BOOL LLRenderTarget::sUseFBO = FALSE;
 LLRenderTarget::LLRenderTarget() :
 	mResX(0),
 	mResY(0),
-	mViewportWidth(0),
-	mViewportHeight(0),
 	mTex(0),
 	mFBO(0),
-	mColorFmt(0),
 	mDepth(0),
 	mStencil(0),
 	mUseDepth(FALSE),
@@ -92,15 +89,10 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth, BOO
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
-	// default viewport to entire texture
-	mViewportWidth = mResX;
-	mViewportHeight = mResY;
 
 	mStencil = stencil;
 	mUsage = usage;
 	mUseDepth = depth;
-	mFBO = 0;
-	mColorFmt = color_fmt;
 
 	release();
 
@@ -320,7 +312,7 @@ void LLRenderTarget::bindTarget()
 		}
 	}
 
-	glViewport(0, 0, mViewportWidth, mViewportHeight);
+	glViewport(0, 0, mResX, mResY);
 	sBoundTarget = this;
 }
 
@@ -523,18 +515,12 @@ BOOL LLRenderTarget::isComplete() const
 	return (!mTex.empty() || mDepth) ? TRUE : FALSE;
 }
 
-void LLRenderTarget::setViewport(U32 width, U32 height)
-{
-	mViewportWidth = llmin(width, mResX);
-	mViewportHeight = llmin(height, mResY);
-}
-
 void LLRenderTarget::getViewport(S32* viewport)
 {
 	viewport[0] = 0;
 	viewport[1] = 0;
-	viewport[2] = mViewportWidth;
-	viewport[3] = mViewportHeight;
+	viewport[2] = mResX;
+	viewport[3] = mResY;
 }
 
 //==================================================
@@ -595,7 +581,7 @@ void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref)
 
 	check_framebuffer_status();
 
-	glViewport(0, 0, mViewportWidth, mViewportHeight);
+	glViewport(0, 0, mResX, mResY);
 
 	sBoundTarget = this;
 }
@@ -610,14 +596,10 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth
 	stop_glerror();
 	mResX = resx;
 	mResY = resy;
-	mViewportWidth = mResX;
-	mViewportHeight = mResY;
 
 	mUsage = usage;
 	mUseDepth = depth;
 	mStencil = stencil;
-	mFBO = 0;
-	mColorFmt = color_fmt;
 
 	releaseSampleBuffer();
 
diff --git a/indra/llrender/llrendertarget.h b/indra/llrender/llrendertarget.h
index 125747424c0b68f3ef999a8a923ee1dd1f622033..b7ebfc8f7f6308cf1221f076ad7abaed90465631 100644
--- a/indra/llrender/llrendertarget.h
+++ b/indra/llrender/llrendertarget.h
@@ -107,9 +107,6 @@ class LLRenderTarget
 	//uses scissor rect if in copy-to-texture mode
 	void clear(U32 mask = 0xFFFFFFFF);
 	
-	// override default viewport to a smaller size
-	void setViewport(U32 width, U32 height);
-
 	//get applied viewport
 	void getViewport(S32* viewport);
 
@@ -153,16 +150,12 @@ class LLRenderTarget
 	friend class LLMultisampleBuffer;
 	U32 mResX;
 	U32 mResY;
-	U32 mViewportWidth;
-	U32 mViewportHeight;
 	std::vector<U32> mTex;
 	U32 mFBO;
-	U32 mColorFmt;
 	U32 mDepth;
 	BOOL mStencil;
 	BOOL mUseDepth;
 	BOOL mRenderDepth;
-
 	LLTexUnit::eTextureType mUsage;
 	U32 mSamples;
 	LLMultisampleBuffer* mSampleBuffer;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index f0b4436df584d87a8760421caa90d9c729f500cc..74b49b846eddac767b1cae5b9191e919fc1bb5d7 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -60,6 +60,7 @@ set(llui_SOURCE_FILES
     llmultisliderctrl.cpp
     llnotifications.cpp
     llnotificationslistener.cpp
+    llnotificationsutil.cpp
     llpanel.cpp
     llprogressbar.cpp
     llradiogroup.cpp
@@ -147,8 +148,10 @@ set(llui_HEADER_FILES
     llmultifloater.h 
     llmultisliderctrl.h
     llmultislider.h
+    llnotificationptr.h
     llnotifications.h
     llnotificationslistener.h
+    llnotificationsutil.h
     llpanel.h
     llprogressbar.h
     llradiogroup.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 8930e320558c315c5d65406af2f867f2f0875130..b91c614424365c16f44ea5dc7cbf8c03cae6ea39 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -48,7 +48,7 @@
 #include "llfloaterreg.h"
 #include "llfocusmgr.h"
 #include "llwindow.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llrender.h"
 #include "lluictrlfactory.h"
 #include "llhelp.h"
@@ -1106,7 +1106,7 @@ void LLButton::showHelp(LLUICtrl* ctrl, const LLSD& sdname)
 
 	// display an error if we can't find a help_topic string.
 	// fix this by adding a help_topic attribute to the xui file
-	LLNotifications::instance().add("UnableToFindHelpTopic");
+	LLNotificationsUtil::add("UnableToFindHelpTopic");
 }
 
 void LLButton::resetMouseDownTimer()
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 8de3a8a96f6089dd3a5367ba201aad061efbb4c0..ddfb0f85347be80c69b8893c1fadb47a7c94f439 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -484,6 +484,8 @@ void LLFlatListView::rearrangeItems()
 void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
 {
 	if (!item_pair) return;
+
+	setFocus(TRUE);
 	
 	bool select_item = !isSelected(item_pair);
 
@@ -554,12 +556,21 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
 			break;
 	}
 
-	if ( key == KEY_UP || key == KEY_DOWN )
+	if ( ( key == KEY_UP || key == KEY_DOWN ) && mSelectedItemPairs.size() )
 	{
-		LLRect selcted_rect = getLastSelectedItemRect().stretch(1);
-		LLRect visible_rect = getVisibleContentRect();
-		if ( !visible_rect.contains (selcted_rect) )
-			scrollToShowRect(selcted_rect);
+		LLRect visible_rc = getVisibleContentRect();
+		LLRect selected_rc = getLastSelectedItemRect();
+
+		if ( !visible_rc.contains (selected_rc) )
+		{
+			// But scroll in Items panel coordinates
+			scrollToShowRect(selected_rc);
+		}
+
+		// In case we are in accordion tab notify parent to show selected rectangle
+		LLRect screen_rc;
+		localRectToScreen(selected_rc, &screen_rc);
+		notifyParent(LLSD().insert("scrollToShowRect",screen_rc.getValue()));
 		handled = TRUE;
 	}
 
@@ -645,8 +656,6 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
 		onCommit();
 	}
 
-	setFocus(TRUE);
-
 	// Stretch selected items rect to ensure it won't be clipped
 	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
 
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index 262afbe661507960ec58e2fef733562cd4e9c567..8cf65fe76a4ccd115e6da5dfc2dbcfe610a569ab 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -66,27 +66,6 @@
 // use this to control "jumping" behavior when Ctrl-Tabbing
 const S32 TABBED_FLOATER_OFFSET = 0;
 
-std::string	LLFloater::sButtonActiveImageNames[BUTTON_COUNT] = 
-{
-	"Icon_Close_Foreground",	//BUTTON_CLOSE
-	"Icon_Restore_Foreground",	//BUTTON_RESTORE
-	"Icon_Minimize_Foreground",	//BUTTON_MINIMIZE
-	"tearoffbox.tga",			//BUTTON_TEAR_OFF
-	"Icon_Dock_Foreground",		//BUTTON_DOCK
-	"Icon_Undock_Foreground",	//BUTTON_UNDOCK
-	"Icon_Help_Foreground"		//BUTTON_HELP
-};
-
-std::string	LLFloater::sButtonPressedImageNames[BUTTON_COUNT] = 
-{
-	"Icon_Close_Press",			//BUTTON_CLOSE
-	"Icon_Restore_Press",		//BUTTON_RESTORE
-	"Icon_Minimize_Press",		//BUTTON_MINIMIZE
-	"tearoff_pressed.tga",		//BUTTON_TEAR_OFF
-	"Icon_Dock_Press",			//BUTTON_DOCK
-	"Icon_Undock_Press",		//BUTTON_UNDOCK
-	"Icon_Help_Press"			//BUTTON_HELP
-};
 
 std::string	LLFloater::sButtonNames[BUTTON_COUNT] = 
 {
@@ -195,6 +174,20 @@ LLFloater::Params::Params()
 	can_dock("can_dock", false),
 	header_height("header_height", 0),
 	legacy_header_height("legacy_header_height", 0),
+	close_image("close_image"),
+	restore_image("restore_image"),
+	minimize_image("minimize_image"),
+	tear_off_image("tear_off_image"),
+	dock_image("dock_image"),
+	undock_image("undock_image"),
+	help_image("help_image"),
+	close_pressed_image("close_pressed_image"),
+	restore_pressed_image("restore_pressed_image"),
+	minimize_pressed_image("minimize_pressed_image"),
+	tear_off_pressed_image("tear_off_pressed_image"),
+	dock_pressed_image("dock_pressed_image"),
+	undock_pressed_image("undock_pressed_image"),
+	help_pressed_image("help_pressed_image"),
 	open_callback("open_callback"),
 	close_callback("close_callback")
 {
@@ -247,11 +240,11 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
 	mDocked(false),
 	mHasBeenDraggedWhileMinimized(FALSE),
 	mPreviousMinimizedBottom(0),
-	mPreviousMinimizedLeft(0),
-	mNotificationContext(NULL)
+	mPreviousMinimizedLeft(0)
+//	mNotificationContext(NULL)
 {
 	mHandle.bind(this);
-	mNotificationContext = new LLFloaterNotificationContext(getHandle());
+//	mNotificationContext = new LLFloaterNotificationContext(getHandle());
 
 	// Clicks stop here.
 	setMouseOpaque(TRUE);
@@ -263,11 +256,9 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
 	// prior rectangle to be used on restore.
 	mExpandedRect.set(0,0,0,0);
 	
-	for (S32 i = 0; i < BUTTON_COUNT; i++)
-	{
-		mButtonsEnabled[i] = FALSE;
-		mButtons[i] = NULL;
-	}
+	memset(mButtonsEnabled, 0, BUTTON_COUNT * sizeof(bool));
+	memset(mButtons, 0, BUTTON_COUNT * sizeof(LLButton*));
+	
 	addDragHandle();
 	addResizeCtrls();
 	
@@ -276,11 +267,11 @@ LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p)
 	// chrome floaters don't take focus at all
 	setFocusRoot(!getIsChrome());
 
-	initFloater();
+	initFloater(p);
 }
 
 // Note: Floaters constructed from XML call init() twice!
-void LLFloater::initFloater()
+void LLFloater::initFloater(const Params& p)
 {
 	// Close button.
 	if (mCanClose)
@@ -305,7 +296,7 @@ void LLFloater::initFloater()
 		mButtonsEnabled[BUTTON_DOCK] = TRUE;
 	}
 
-	buildButtons();
+	buildButtons(p);
 
 	// Floaters are created in the invisible state	
 	setVisible(FALSE);
@@ -468,8 +459,8 @@ LLFloater::~LLFloater()
 {
 	LLFloaterReg::removeInstance(mInstanceName, mKey);
 	
-	delete mNotificationContext;
-	mNotificationContext = NULL;
+//	delete mNotificationContext;
+//	mNotificationContext = NULL;
 
 	//// am I not hosted by another floater?
 	//if (mHostHandle.isDead())
@@ -1280,7 +1271,7 @@ void LLFloater::removeDependentFloater(LLFloater* floaterp)
 	floaterp->mDependeeHandle = LLHandle<LLFloater>();
 }
 
-BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index)
+BOOL LLFloater::offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index)
 {
 	if( mButtonsEnabled[index] )
 	{
@@ -1798,7 +1789,7 @@ void LLFloater::updateButtons()
 		mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));
 }
 
-void LLFloater::buildButtons()
+void LLFloater::buildButtons(const Params& floater_params)
 {
 	static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
 	static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0);
@@ -1832,17 +1823,18 @@ void LLFloater::buildButtons()
 		LLButton::Params p;
 		p.name(sButtonNames[i]);
 		p.rect(btn_rect);
-		p.image_unselected.name(sButtonActiveImageNames[i]);
+		p.image_unselected = getButtonImage(floater_params, (EFloaterButton)i);
 		// Selected, no matter if hovered or not, is "pressed"
-		p.image_selected.name(sButtonPressedImageNames[i]);
-		p.image_hover_selected.name(sButtonPressedImageNames[i]);
+		LLUIImage* pressed_image = getButtonPressedImage(floater_params, (EFloaterButton)i);
+		p.image_selected = pressed_image;
+		p.image_hover_selected = pressed_image;
 		// Use a glow effect when the user hovers over the button
 		// These icons are really small, need glow amount increased
 		p.hover_glow_amount( 0.33f );
 		p.click_callback.function(boost::bind(sButtonCallbacks[i], this));
 		p.tab_stop(false);
 		p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
-		p.tool_tip(sButtonToolTips[i]);
+		p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);
 		p.scale_image(true);
 		p.chrome(true);
 
@@ -1854,6 +1846,59 @@ void LLFloater::buildButtons()
 	updateButtons();
 }
 
+// static
+LLUIImage* LLFloater::getButtonImage(const Params& p, EFloaterButton e)
+{
+	switch(e)
+	{
+		default:
+		case BUTTON_CLOSE:
+			return p.close_image;
+		case BUTTON_RESTORE:
+			return p.restore_image;
+		case BUTTON_MINIMIZE:
+			return p.minimize_image;
+		case BUTTON_TEAR_OFF:
+			return p.tear_off_image;
+		case BUTTON_DOCK:
+			return p.dock_image;
+		case BUTTON_UNDOCK:
+			return p.undock_image;
+		case BUTTON_HELP:
+			return p.help_image;
+	}
+}
+
+// static
+LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)
+{
+	switch(e)
+	{
+		default:
+		case BUTTON_CLOSE:
+			return p.close_pressed_image;
+		case BUTTON_RESTORE:
+			return p.restore_pressed_image;
+		case BUTTON_MINIMIZE:
+			return p.minimize_pressed_image;
+		case BUTTON_TEAR_OFF:
+			return p.tear_off_pressed_image;
+		case BUTTON_DOCK:
+			return p.dock_pressed_image;
+		case BUTTON_UNDOCK:
+			return p.undock_pressed_image;
+		case BUTTON_HELP:
+			return p.help_pressed_image;
+	}
+}
+
+// static
+std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e)
+{
+	// TODO: per-floater localizable tooltips set in XML
+	return sButtonToolTips[e];
+}
+
 /////////////////////////////////////////////////////
 // LLFloaterView
 
@@ -2672,7 +2717,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
 	setupParams(params, parent);
  	initFromParams(params);
 	
-	initFloater();
+	initFloater(params);
 	
 	LLMultiFloater* last_host = LLFloater::getFloaterHost();
 	if (node->hasName("multi_floater"))
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 1b98dddddc54281af7bb74591d3d67ef6ad298cf..d7ec0aac00e76a104d1ef4dae1bad0e3c2c1b796 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -39,7 +39,7 @@
 
 #include "llpanel.h"
 #include "lluuid.h"
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
 #include <set>
 
 class LLDragHandle;
@@ -65,20 +65,6 @@ const BOOL CLOSE_NO = FALSE;
 const BOOL ADJUST_VERTICAL_YES = TRUE;
 const BOOL ADJUST_VERTICAL_NO = FALSE;
 
-// associates a given notification instance with a particular floater
-class LLFloaterNotificationContext : 
-	public LLNotificationContext
-{
-public:
-	LLFloaterNotificationContext(LLHandle<LLFloater> floater_handle) :
-		mFloaterHandle(floater_handle)
-	{}
-
-	LLFloater* getFloater() { return mFloaterHandle.get(); }
-private:
-	LLHandle<LLFloater> mFloaterHandle;
-};
-
 class LLFloater : public LLPanel
 {
 friend class LLFloaterView;
@@ -97,7 +83,7 @@ friend class LLMultiFloater;
 |*==========================================================================*/
 	};
 	
-	enum EFloaterButtons
+	enum EFloaterButton
 	{
 		BUTTON_CLOSE = 0,
 		BUTTON_RESTORE,
@@ -128,6 +114,22 @@ friend class LLMultiFloater;
 								can_dock;
 		Optional<S32>			header_height,
 								legacy_header_height; // HACK see initFromXML()
+
+		// Images for top-right controls
+		Optional<LLUIImage*>	close_image,
+								restore_image,
+								minimize_image,
+								tear_off_image,
+								dock_image,
+								undock_image,
+								help_image;
+		Optional<LLUIImage*>	close_pressed_image,
+								restore_pressed_image,
+								minimize_pressed_image,
+								tear_off_pressed_image,
+								dock_pressed_image,
+								undock_pressed_image,
+								help_pressed_image;
 		
 		Optional<CommitCallbackParam> open_callback,
 									  close_callback;
@@ -158,7 +160,7 @@ friend class LLMultiFloater;
 	/*virtual*/ void setIsChrome(BOOL is_chrome);
 	/*virtual*/ void setRect(const LLRect &rect);
 
-	void 			initFloater();
+	void 			initFloater(const Params& p);
 
 	void			openFloater(const LLSD& key = LLSD());
 
@@ -264,10 +266,10 @@ friend class LLMultiFloater;
 	// handle refocusing.
 	static void		closeFocusedFloater();
 
-	LLNotification::Params contextualNotification(const std::string& name) 
-	{ 
-	    return LLNotification::Params(name).context(mNotificationContext); 
-	}
+//	LLNotification::Params contextualNotification(const std::string& name) 
+//	{ 
+//	    return LLNotification::Params(name).context(mNotificationContext); 
+//	}
 
 	static void		onClickClose(LLFloater* floater);
 	static void		onClickMinimize(LLFloater* floater);
@@ -309,8 +311,15 @@ friend class LLMultiFloater;
 	void			cleanupHandles(); // remove handles to dead floaters
 	void			createMinimizeButton();
 	void			updateButtons();
-	void			buildButtons();
-	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButtons index);
+	void			buildButtons(const Params& p);
+	
+	// Images and tooltips are named in the XML, but we want to look them
+	// up by index.
+	static LLUIImage*	getButtonImage(const Params& p, EFloaterButton e);
+	static LLUIImage*	getButtonPressedImage(const Params& p, EFloaterButton e);
+	static std::string	getButtonTooltip(const Params& p, EFloaterButton e);
+	
+	BOOL			offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
 	void			addResizeCtrls();
 	void			layoutResizeCtrls();
 	void			enableResizeCtrls(bool enable);
@@ -368,7 +377,7 @@ friend class LLMultiFloater;
 	typedef std::set<LLHandle<LLFloater> >::iterator handle_set_iter_t;
 	handle_set_t	mDependents;
 
-	BOOL			mButtonsEnabled[BUTTON_COUNT];
+	bool			mButtonsEnabled[BUTTON_COUNT];
 	LLButton*		mButtons[BUTTON_COUNT];
 	F32				mButtonScale;
 	BOOL			mAutoFocus;
@@ -382,8 +391,6 @@ friend class LLMultiFloater;
 
 	static LLMultiFloater* sHostp;
 	static BOOL		sQuitting;
-	static std::string	sButtonActiveImageNames[BUTTON_COUNT];
-	static std::string	sButtonPressedImageNames[BUTTON_COUNT];
 	static std::string	sButtonNames[BUTTON_COUNT];
 	static std::string	sButtonToolTips[BUTTON_COUNT];
 	static std::string  sButtonToolTipsIndex[BUTTON_COUNT];
@@ -401,7 +408,7 @@ friend class LLMultiFloater;
 	S32				mPreviousMinimizedBottom;
 	S32				mPreviousMinimizedLeft;
 
-	LLFloaterNotificationContext* mNotificationContext;
+//	LLFloaterNotificationContext* mNotificationContext;
 	LLRootHandle<LLFloater>		mHandle;	
 };
 
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index bd5734312a3185b629e3fcea22ef5a2787fa7eb0..4ea30dbd4d42aeedc51ab2891cf27c0d82e16744 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -125,8 +125,8 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
 	mScrollHPos( 0 ),
 	mTextPadLeft(p.text_pad_left),
 	mTextPadRight(p.text_pad_right),
-	mMinHPixels(0),		// computed in updateTextPadding() below
-	mMaxHPixels(0),		// computed in updateTextPadding() below
+	mTextLeftEdge(0),		// computed in updateTextPadding() below
+	mTextRightEdge(0),		// computed in updateTextPadding() below
 	mCommitOnFocusLost( p.commit_on_focus_lost ),
 	mRevertOnEsc( p.revert_on_esc ),
 	mKeystrokeCallback( p.keystroke_callback() ),
@@ -338,9 +338,8 @@ void LLLineEditor::setTextPadding(S32 left, S32 right)
 
 void LLLineEditor::updateTextPadding()
 {
-	static LLUICachedControl<S32> line_editor_hpad ("UILineEditorHPad", 0);
-	mMinHPixels = line_editor_hpad + llclamp(mTextPadLeft, 0, getRect().getWidth());;
-	mMaxHPixels = getRect().getWidth() - mMinHPixels - llclamp(mTextPadRight, 0, getRect().getWidth());
+	mTextLeftEdge = llclamp(mTextPadLeft, 0, getRect().getWidth());
+	mTextRightEdge = getRect().getWidth() - llclamp(mTextPadRight, 0, getRect().getWidth());
 }
 
 
@@ -406,8 +405,8 @@ void LLLineEditor::setCursorAtLocalPos( S32 local_mouse_x )
 		mScrollHPos + 
 		mGLFont->charFromPixelOffset(
 			wtext, mScrollHPos,
-			(F32)(local_mouse_x - mMinHPixels),
-			(F32)(mMaxHPixels - mMinHPixels + 1)); // min-max range is inclusive
+			(F32)(local_mouse_x - mTextLeftEdge),
+			(F32)(mTextRightEdge - mTextLeftEdge + 1)); // min-max range is inclusive
 	setCursor(cursor_pos);
 }
 
@@ -417,11 +416,11 @@ void LLLineEditor::setCursor( S32 pos )
 	mCursorPos = llclamp( pos, 0, mText.length());
 
 	S32 pixels_after_scroll = findPixelNearestPos();
-	if( pixels_after_scroll > mMaxHPixels )
+	if( pixels_after_scroll > mTextRightEdge )
 	{
 		S32 width_chars_to_left = mGLFont->getWidth(mText.getWString().c_str(), 0, mScrollHPos);
-		S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mMaxHPixels - mMinHPixels + width_chars_to_left))); 
-		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mMaxHPixels - mMinHPixels), mText.length(), getCursor());
+		S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mTextRightEdge - mTextLeftEdge + width_chars_to_left))); 
+		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), getCursor());
 		if (old_cursor_pos == last_visible_char)
 		{
 			mScrollHPos = llmin(mText.length(), llmax(min_scroll, mScrollHPos + SCROLL_INCREMENT_ADD));
@@ -682,17 +681,17 @@ BOOL LLLineEditor::handleHover(S32 x, S32 y, MASK mask)
 			S32 increment = llround(mScrollTimer.getElapsedTimeF32() / AUTO_SCROLL_TIME);
 			mScrollTimer.reset();
 			mScrollTimer.setTimerExpirySec(AUTO_SCROLL_TIME);
-			if( (x < mMinHPixels) && (mScrollHPos > 0 ) )
+			if( (x < mTextLeftEdge) && (mScrollHPos > 0 ) )
 			{
 				// Scroll to the left
 				mScrollHPos = llclamp(mScrollHPos - increment, 0, mText.length());
 			}
 			else
-			if( (x > mMaxHPixels) && (mCursorPos < (S32)mText.length()) )
+			if( (x > mTextRightEdge) && (mCursorPos < (S32)mText.length()) )
 			{
 				// If scrolling one pixel would make a difference...
 				S32 pixels_after_scrolling_one_char = findPixelNearestPos(1);
-				if( pixels_after_scrolling_one_char >= mMaxHPixels )
+				if( pixels_after_scrolling_one_char >= mTextRightEdge )
 				{
 					// ...scroll to the right
 					mScrollHPos = llclamp(mScrollHPos + increment, 0, mText.length());
@@ -1671,7 +1670,7 @@ void LLLineEditor::draw()
 	}
 
 	S32 rendered_text = 0;
-	F32 rendered_pixels_right = (F32)mMinHPixels;
+	F32 rendered_pixels_right = (F32)mTextLeftEdge;
 	F32 text_bottom = (F32)background.mBottom + (F32)lineeditor_v_pad;
 
 	if( (gFocusMgr.getKeyboardFocus() == this) && hasSelection() )
@@ -1700,17 +1699,17 @@ void LLLineEditor::draw()
 				0,
 				LLFontGL::NO_SHADOW,
 				select_left - mScrollHPos,
-				mMaxHPixels - llround(rendered_pixels_right),
+				mTextRightEdge - llround(rendered_pixels_right),
 				&rendered_pixels_right);
 		}
 		
-		if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) )
+		if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
 		{
 			LLColor4 color = mHighlightColor;
 			color.setAlpha(alpha);
 			// selected middle
 			S32 width = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos + rendered_text, select_right - mScrollHPos - rendered_text);
-			width = llmin(width, mMaxHPixels - llround(rendered_pixels_right));
+			width = llmin(width, mTextRightEdge - llround(rendered_pixels_right));
 			gl_rect_2d(llround(rendered_pixels_right), cursor_top, llround(rendered_pixels_right)+width, cursor_bottom, color);
 
 			LLColor4 tmp_color( 1.f - text_color.mV[0], 1.f - text_color.mV[1], 1.f - text_color.mV[2], alpha );
@@ -1722,11 +1721,11 @@ void LLLineEditor::draw()
 				0,
 				LLFontGL::NO_SHADOW,
 				select_right - mScrollHPos - rendered_text,
-				mMaxHPixels - llround(rendered_pixels_right),
+				mTextRightEdge - llround(rendered_pixels_right),
 				&rendered_pixels_right);
 		}
 
-		if( (rendered_pixels_right < (F32)mMaxHPixels) && (rendered_text < text_len) )
+		if( (rendered_pixels_right < (F32)mTextRightEdge) && (rendered_text < text_len) )
 		{
 			// unselected, right side
 			mGLFont->render( 
@@ -1737,7 +1736,7 @@ void LLLineEditor::draw()
 				0,
 				LLFontGL::NO_SHADOW,
 				S32_MAX,
-				mMaxHPixels - llround(rendered_pixels_right),
+				mTextRightEdge - llround(rendered_pixels_right),
 				&rendered_pixels_right);
 		}
 	}
@@ -1751,7 +1750,7 @@ void LLLineEditor::draw()
 			0,
 			LLFontGL::NO_SHADOW,
 			S32_MAX,
-			mMaxHPixels - llround(rendered_pixels_right),
+			mTextRightEdge - llround(rendered_pixels_right),
 			&rendered_pixels_right);
 	}
 #if 1 // for when we're ready for image art.
@@ -1809,14 +1808,14 @@ void LLLineEditor::draw()
 		if (0 == mText.length() && mReadOnly)
 		{
 			mGLFont->render(mLabel.getWString(), 0,
-							mMinHPixels, (F32)text_bottom,
+							mTextLeftEdge, (F32)text_bottom,
 							label_color,
 							LLFontGL::LEFT,
 							LLFontGL::BOTTOM,
 							0,
 							LLFontGL::NO_SHADOW,
 							S32_MAX,
-							mMaxHPixels - llround(rendered_pixels_right),
+							mTextRightEdge - llround(rendered_pixels_right),
 							&rendered_pixels_right, FALSE);
 		}
 
@@ -1834,14 +1833,14 @@ void LLLineEditor::draw()
 		if (0 == mText.length())
 		{
 			mGLFont->render(mLabel.getWString(), 0,
-							mMinHPixels, (F32)text_bottom,
+							mTextLeftEdge, (F32)text_bottom,
 							label_color,
 							LLFontGL::LEFT,
 							LLFontGL::BOTTOM,
 							0,
 							LLFontGL::NO_SHADOW,
 							S32_MAX,
-							mMaxHPixels - llround(rendered_pixels_right),
+							mTextRightEdge - llround(rendered_pixels_right),
 							&rendered_pixels_right, FALSE);
 		}
 		// Draw children (border)
@@ -1859,7 +1858,7 @@ void LLLineEditor::draw()
 S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
 {
 	S32 dpos = getCursor() - mScrollHPos + cursor_offset;
-	S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mMinHPixels;
+	S32 result = mGLFont->getWidth(mText.getWString().c_str(), mScrollHPos, dpos) + mTextLeftEdge;
 	return result;
 }
 
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index 4c4b00094d4feedaed59d13848f0669d850b499e..b96220e0207bef8831f0ca36faf6a7d18356db63 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -303,8 +303,8 @@ class LLLineEditor
 	LLFrameTimer mScrollTimer;
 	S32			mTextPadLeft;				// Used to reserve space before the beginning of the text for children.
 	S32			mTextPadRight;				// Used to reserve space after the end of the text for children.
-	S32			mMinHPixels;
-	S32			mMaxHPixels;
+	S32			mTextLeftEdge;				// Pixels, cached left edge of text based on left padding and width
+	S32			mTextRightEdge;				// Pixels, cached right edge of text based on right padding and width
 
 	BOOL		mCommitOnFocusLost;
 	BOOL		mRevertOnEsc;
diff --git a/indra/llui/llnotificationptr.h b/indra/llui/llnotificationptr.h
new file mode 100644
index 0000000000000000000000000000000000000000..0718f7d18243e76f44fd2f19b670b757c06138e7
--- /dev/null
+++ b/indra/llui/llnotificationptr.h
@@ -0,0 +1,41 @@
+/**
+ * @file llnotificationptr.h
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLNOTIFICATIONPTR_H
+#define LLNOTIFICATIONPTR_H
+
+// Many classes just store a single LLNotificationPtr
+// and llnotifications.h is very large, so define this ligher header.
+#include <boost/shared_ptr.hpp>
+
+class LLNotification;
+typedef boost::shared_ptr<LLNotification> LLNotificationPtr;
+
+#endif
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index eb8cc3e2c5007f697f07d2d9a09924f56f000071..05f2d3a9cfd379b4420306f81a5d5413b37c5392 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -1395,10 +1395,9 @@ void LLNotifications::addFromCallback(const LLSD& name)
 	add(LLNotification::Params().name(name.asString()));	
 }
 
-// we provide a couple of simple add notification functions so that it's reasonable to create notifications in one line
 LLNotificationPtr LLNotifications::add(const std::string& name, 
-										const LLSD& substitutions, 
-										const LLSD& payload)
+									   const LLSD& substitutions, 
+									   const LLSD& payload)
 {
 	LLNotification::Params::Functor functor_p;
 	functor_p.name = name;
@@ -1406,15 +1405,16 @@ LLNotificationPtr LLNotifications::add(const std::string& name,
 }
 
 LLNotificationPtr LLNotifications::add(const std::string& name, 
-										const LLSD& substitutions, 
-										const LLSD& payload, 
-										const std::string& functor_name)
+									   const LLSD& substitutions, 
+									   const LLSD& payload, 
+									   const std::string& functor_name)
 {
 	LLNotification::Params::Functor functor_p;
 	functor_p.name = functor_name;
 	return add(LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
 }
-
+							  
+//virtual
 LLNotificationPtr LLNotifications::add(const std::string& name, 
 										const LLSD& substitutions, 
 										const LLSD& payload, 
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 0d7cb74f7044602874487569445acfff12503b82..aeb4cebf1b403d3d59fcca6ff17a0a1bb974c6d8 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -103,9 +103,7 @@
 #include "llpointer.h"
 #include "llinitparam.h"
 #include "llnotificationslistener.h"
-
-class LLNotification;
-typedef boost::shared_ptr<LLNotification> LLNotificationPtr;
+#include "llnotificationptr.h"
 
 	
 typedef enum e_notification_priority
@@ -841,10 +839,11 @@ class LLNotifications :
 	// Add a simple notification (from XUI)
 	void addFromCallback(const LLSD& name);
 	
-	// we provide a collection of simple add notification functions so that it's reasonable to create notifications in one line
+	// *NOTE: To add simple notifications, #include "llnotificationsutil.h"
+	// and use LLNotificationsUtil::add("MyNote") or add("MyNote", args)
 	LLNotificationPtr add(const std::string& name, 
-						const LLSD& substitutions = LLSD(), 
-						const LLSD& payload = LLSD());
+						const LLSD& substitutions,
+						const LLSD& payload);
 	LLNotificationPtr add(const std::string& name, 
 						const LLSD& substitutions, 
 						const LLSD& payload, 
diff --git a/indra/llui/llnotificationsutil.cpp b/indra/llui/llnotificationsutil.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2cd165f1b30656130e73053a97112f05eb213105
--- /dev/null
+++ b/indra/llui/llnotificationsutil.cpp
@@ -0,0 +1,91 @@
+/**
+ * @file llnotificationsutil.cpp
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "linden_common.h"
+
+#include "llnotificationsutil.h"
+
+#include "llnotifications.h"
+#include "llsd.h"
+#include "llxmlnode.h"	// apparently needed to call LLNotifications::instance()
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = name;
+	return LLNotifications::instance().add(
+		LLNotification::Params().name(name).substitutions(LLSD()).payload(LLSD()).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name, 
+					  const LLSD& substitutions)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = name;
+	return LLNotifications::instance().add(
+		LLNotification::Params().name(name).substitutions(substitutions).payload(LLSD()).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name, 
+					  const LLSD& substitutions, 
+					  const LLSD& payload)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = name;
+	return LLNotifications::instance().add(
+		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name, 
+					  const LLSD& substitutions, 
+					  const LLSD& payload, 
+					  const std::string& functor_name)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.name = functor_name;
+	return LLNotifications::instance().add(
+		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+LLNotificationPtr LLNotificationsUtil::add(const std::string& name, 
+					  const LLSD& substitutions, 
+					  const LLSD& payload, 
+					  boost::function<void (const LLSD&, const LLSD&)> functor)
+{
+	LLNotification::Params::Functor functor_p;
+	functor_p.function = functor;
+	return LLNotifications::instance().add(
+		LLNotification::Params().name(name).substitutions(substitutions).payload(payload).functor(functor_p));	
+}
+
+S32 LLNotificationsUtil::getSelectedOption(const LLSD& notification, const LLSD& response)
+{
+	return LLNotification::getSelectedOption(notification, response);
+}
diff --git a/indra/llui/llnotificationsutil.h b/indra/llui/llnotificationsutil.h
new file mode 100644
index 0000000000000000000000000000000000000000..a0801b338ff64bc8ecee18e44db9b51eefb54c6a
--- /dev/null
+++ b/indra/llui/llnotificationsutil.h
@@ -0,0 +1,68 @@
+/**
+ * @file llnotificationsutil.h
+ *
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
+ * 
+ * Copyright (c) 2008-2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LLNOTIFICATIONSUTIL_H
+#define LLNOTIFICATIONSUTIL_H
+
+// The vast majority of clients of the notifications system just want to add 
+// a notification to the screen, so define this lightweight public interface
+// to avoid including the heavyweight llnotifications.h
+
+#include "llnotificationptr.h"
+
+#include <boost/function.hpp>
+
+class LLSD;
+
+namespace LLNotificationsUtil
+{
+	LLNotificationPtr add(const std::string& name);
+	
+	LLNotificationPtr add(const std::string& name, 
+						  const LLSD& substitutions);
+	
+	LLNotificationPtr add(const std::string& name, 
+						  const LLSD& substitutions, 
+						  const LLSD& payload);
+	
+	LLNotificationPtr add(const std::string& name, 
+						  const LLSD& substitutions, 
+						  const LLSD& payload, 
+						  const std::string& functor_name);
+
+	LLNotificationPtr add(const std::string& name, 
+						  const LLSD& substitutions, 
+						  const LLSD& payload, 
+						  boost::function<void (const LLSD&, const LLSD&)> functor);
+	
+	S32 getSelectedOption(const LLSD& notification, const LLSD& response);
+}
+
+#endif
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index c8b6e814e13dfb4970fac5132d079d67bab57eb7..62ca569e6cf214ea18df14a9e7156273943c0363 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()
 void LLProgressBar::draw()
 {
 	static LLTimer timer;
-
-	LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga");
+	F32 alpha = getDrawContext().mAlpha;
 	
-	mImageBar->draw(getLocalRect(), mColorBackground.get());
+	LLColor4 image_bar_color = mColorBackground.get();
+	image_bar_color.setAlpha(alpha);
+	mImageBar->draw(getLocalRect(), image_bar_color);
 
-	F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
+	alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
 	LLColor4 bar_color = mColorBar.get();
 	bar_color.mV[VALPHA] *= alpha; // modulate alpha
 	LLRect progress_rect = getLocalRect();
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index a7cf9be277a778eb660237a094d33b7a65f6898a..0c46edf300a3ae3aefaf5c3044ddeb375bcb46ea 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -144,9 +144,10 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
 		if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
 		{
 			// undock floater when user resize it
-			if (((LLFloater*)getParent())->isDocked())
+			LLFloater* parent = dynamic_cast<LLFloater*>( getParent());
+			if (parent && parent->isDocked())
 			{
-				((LLFloater*)getParent())->setDocked(false, false);
+				parent->setDocked( false, false);
 			}
 
 			// Resize the parent
diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp
index 5e17372fe948edec09a23f15d44206fdfee0e3ad..d91b58b4ea6ed46f3578f8449b3dd33617e7d8ce 100644
--- a/indra/llui/llscrollcontainer.cpp
+++ b/indra/llui/llscrollcontainer.cpp
@@ -111,7 +111,8 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)
 	LLView::addChild( mBorder );
 
 	mInnerRect.set( 0, getRect().getHeight(), getRect().getWidth(), 0 );
-	mInnerRect.stretch( -mBorder->getBorderWidth()  );
+	if ( mBorder->getVisible() )
+		mInnerRect.stretch( -mBorder->getBorderWidth() );
 
 	LLRect vertical_scroll_rect = mInnerRect;
 	vertical_scroll_rect.mLeft = vertical_scroll_rect.mRight - scrollbar_size;
@@ -189,7 +190,8 @@ void LLScrollContainer::reshape(S32 width, S32 height,
 	LLUICtrl::reshape( width, height, called_from_parent );
 
 	mInnerRect = getLocalRect();
-	mInnerRect.stretch( -mBorder->getBorderWidth() );
+	if ( mBorder->getVisible() )
+		mInnerRect.stretch( -mBorder->getBorderWidth() );
 
 	if (mScrolledView)
 	{
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 959313a5b6660be7c8099a32b9b4b0534a41ae24..d7228c78bd3d0eca3c361695600bba85ca340690 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -228,7 +228,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
 	{
 		LLButton::Params p_button;
 		p_button.name(std::string("play_media"));
-		p_button.label(""); // provid label but set to empty so name does not overwrite it -angela
+		p_button.label(""); // provide label but set to empty so name does not overwrite it -angela
 		TOOLTIP_PLAYBUTTON_SIZE = 16;
 		LLRect button_rect;
 		button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp
index 4c800a502db3ceef9a722ca12df49231a8ebbf7c..d6f17dbb085779b71ed29e2ff9ff527647f98ca8 100644
--- a/indra/llxuixml/lltrans.cpp
+++ b/indra/llxuixml/lltrans.cpp
@@ -162,7 +162,7 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil::
 		args["STRING_NAME"] = xml_desc;
 		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
 
-		//LLNotifications::instance().add("MissingString", args); // *TODO: resurrect
+		//LLNotificationsUtil::add("MissingString", args); // *TODO: resurrect
 		//return xml_desc;
 
 		return "MissingString("+xml_desc+")";
@@ -189,7 +189,7 @@ bool LLTrans::findString(std::string &result, const std::string &xml_desc, const
 		LLSD args;
 		args["STRING_NAME"] = xml_desc;
 		LL_WARNS_ONCE("configuration") << "Missing String in strings.xml: [" << xml_desc << "]" << LL_ENDL;
-		//LLNotifications::instance().add("MissingString", args);
+		//LLNotificationsUtil::add("MissingString", args);
 		
 		return false;
 	}
diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp
index 6acac074233cb578171a71a4c07b90535fde6449..8c8fa24a657bad1026427c8dbb1bf7832f8ded77 100644
--- a/indra/media_plugins/base/media_plugin_base.cpp
+++ b/indra/media_plugins/base/media_plugin_base.cpp
@@ -2,6 +2,7 @@
  * @file media_plugin_base.cpp
  * @brief Media plugin base class for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h
index f1e96335f92e301170369343ca64292dcaee840f..4dd157a07c827a12c8cd8f56a178626df77e29e3 100644
--- a/indra/media_plugins/base/media_plugin_base.h
+++ b/indra/media_plugins/base/media_plugin_base.h
@@ -2,6 +2,7 @@
  * @file media_plugin_base.h
  * @brief Media plugin base class for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index 99e0199a293ed4a43200aa1b885f462330079f7b..f5b077fea037410a80d4643fb11328c8231aacad 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -2,6 +2,7 @@
  * @file media_plugin_example.cpp
  * @brief Example plugin for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2009, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
index ef41736c185ace01bb048d307db719be73102add..48accd3e66da6d166676176bd2cf4ac8f29d5ea8 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -3,6 +3,7 @@
  * @author Tofu Linden
  * @brief implementation that supports media playback via GStreamer.
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
  * Copyright (c) 2007-2009, Linden Research, Inc.
@@ -29,6 +30,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 // header guard
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
index cc52232496c703a984eb505cd824019c516e8aa4..52cea46d467328b8222632ccd550b9818c4d1acd 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -2,6 +2,7 @@
  * @file llmediaimplgstreamer_syms.cpp
  * @brief dynamic GStreamer symbol-grabbing code
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
  * Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
index ee7473d6d1d919b4b412d360b0d8ad5b57791e3c..88f100af6e66497fe6f022dcb17108e0cf045639 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
@@ -2,6 +2,7 @@
  * @file llmediaimplgstreamer_syms.h
  * @brief dynamic GStreamer symbol-grabbing code
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
  * Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index e31d4a3282c6fc3331eaaae516d8f88d98826102..2244ccc146139a352f107cbf96270a5494e6ae21 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -2,6 +2,7 @@
  * @file llmediaimplgstreamertriviallogging.h
  * @brief minimal logging utilities.
  *
+ * @cond
  * $LicenseInfo:firstyear=2009&license=viewergpl$
  * 
  * Copyright (c) 2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
index d8ccfaa7021538fcf7efa854af9225584e0fc0ab..5bb0ef5a997f589b7f8c2a078a250fe282512816 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -2,6 +2,7 @@
  * @file llmediaimplgstreamervidplug.h
  * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
  * Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
index f6d55b8758015452c98606fdccbfe086e0f0ec30..208523e8d027d8c63474d5cedcead01f76c879a7 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -2,6 +2,7 @@
  * @file llmediaimplgstreamervidplug.h
  * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  * 
  * Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #ifndef __GST_SLVIDEO_H__
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index a4c43988baa8cc5a7277f00ec0a02baab7c21b46..d21ff26f838a69a1f6ee622fe1a2f5149f6f0971 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -2,6 +2,7 @@
  * @file media_plugin_gstreamer010.cpp
  * @brief GStreamer-0.10 plugin for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2007&license=viewergpl$
  *
  * Copyright (c) 2007, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 236f79978de800301c175a15163e841d6203dd8c..dbc44c833453681e2aa7f2e1a122b16ae0fead17 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -2,6 +2,7 @@
  * @file media_plugin_quicktime.cpp
  * @brief QuickTime plugin for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "linden_common.h"
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 09348782a45c6a1a2fde17b4d158dbd02465db90..30c74832294ade6c6fa516e17d7987ed93c21d9b 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -2,6 +2,7 @@
  * @file media_plugin_webkit.cpp
  * @brief Webkit plugin for LLMedia API plugin system
  *
+ * @cond
  * $LicenseInfo:firstyear=2008&license=viewergpl$
  *
  * Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  * COMPLETENESS OR PERFORMANCE.
  * $/LicenseInfo$
+ * @endcond
  */
 
 #include "llqtwebkit.h"
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index e632cbaaf2a148a265b79c0954f190f28faf90db..91f43137c5248bbc4f5e4f93199fde4567318482 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -90,6 +90,7 @@ set(viewer_SOURCE_FILES
     llbox.cpp
     llbreadcrumbview.cpp
     llcallbacklist.cpp
+    llcallfloater.cpp
     llcallingcard.cpp
     llcapabilitylistener.cpp
     llcaphttpsender.cpp
@@ -185,7 +186,7 @@ set(viewer_SOURCE_FILES
     llfloatermediasettings.cpp
     llfloatermemleak.cpp
     llfloaternamedesc.cpp
-        llfloaternearbymedia.cpp
+    llfloaternearbymedia.cpp
     llfloaternotificationsconsole.cpp
     llfloateropenobject.cpp
     llfloaterparcel.cpp
@@ -212,6 +213,7 @@ set(viewer_SOURCE_FILES
     llfloaterurldisplay.cpp
     llfloaterurlentry.cpp
     llfloatervoicedevicesettings.cpp
+    llfloatervolumepulldown.cpp
     llfloaterwater.cpp
     llfloaterwhitelistentry.cpp
     llfloaterwindlight.cpp
@@ -291,6 +293,7 @@ set(viewer_SOURCE_FILES
     llnetmap.cpp
     llnotificationalerthandler.cpp
     llnotificationgrouphandler.cpp
+    llnotificationhandlerutil.cpp
     llnotificationmanager.cpp
     llnotificationofferhandler.cpp
     llnotificationscripthandler.cpp
@@ -588,6 +591,7 @@ set(viewer_HEADER_FILES
     llbox.h
     llbreadcrumbview.h
     llcallbacklist.h
+    llcallfloater.h
     llcallingcard.h
     llcapabilitylistener.h
     llcapabilityprovider.h
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index ec80d2d01409e30623e1836297058caa475837eb..d7bb64ce8a7787b39abc4bf24ebfc954571cdfdb 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -34,7 +34,6 @@
 						</array>
 					<key>classes</key>
 						<array>
-							<string>LLBottomTray</string>
 						</array>
 					<key>files</key>
 						<array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 075aee46c757dcf97169c568eebb228c978b1b46..b0f782622ced7c21c2c3a54069dd0db7b9ff18a9 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9251,17 +9251,6 @@
       <key>Value</key>
       <integer>2</integer>
     </map>
-    <key>UILineEditorHPad</key>
-    <map>
-      <key>Comment</key>
-      <string>UI Line Editor Horizontal Pad</string>
-      <key>Persist</key>
-      <integer>1</integer>
-      <key>Type</key>
-      <string>S32</string>
-      <key>Value</key>
-      <integer>2</integer>
-    </map>
     <key>UILineEditorVPad</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2644235114e97772efbe7afb879fa526675e27fe..2b582c90f00d2edb59e4647aa702398f122d2cfd 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -58,6 +58,7 @@
 #include "llmoveview.h"
 #include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
 #include "llnearbychatbar.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "llsdutil.h"
 #include "llsidetray.h"
@@ -2304,11 +2305,11 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
 		if (user_cancel && !mAutoPilotBehaviorName.empty())
 		{
 			if (mAutoPilotBehaviorName == "Sit")
-				LLNotifications::instance().add("CancelledSit");
+				LLNotificationsUtil::add("CancelledSit");
 			else if (mAutoPilotBehaviorName == "Attach")
-				LLNotifications::instance().add("CancelledAttach");
+				LLNotificationsUtil::add("CancelledAttach");
 			else
-				LLNotifications::instance().add("Cancelled");
+				LLNotificationsUtil::add("Cancelled");
 		}
 	}
 }
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 1552c985943da85fc2caaa80a13636969103cd26..b52b58f9e2d0bb0c9b1b8ebc48e56e94bb62004c 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -41,6 +41,7 @@
 #include "llinventorybridge.h"
 #include "llinventoryobserver.h"
 #include "llinventorypanel.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llviewerregion.h"
 #include "llvoavatarself.h"
@@ -1021,7 +1022,7 @@ void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void*
 void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 index)
 {
 	// Try to recover by replacing missing wearable with a new one.
-	LLNotifications::instance().add("ReplacedMissingWearable");
+	LLNotificationsUtil::add("ReplacedMissingWearable");
 	lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) << " could not be downloaded.  Replaced inventory item with default wearable." << llendl;
 	LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type);
 
@@ -1417,7 +1418,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
 				LLSD payload;
 				payload["wearable_type"] = (S32)type;
 				// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-				LLNotifications::instance().add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);
+				LLNotificationsUtil::add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);
 				return;
 			}
 			else
@@ -1434,7 +1435,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
 // static 
 bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	EWearableType type = (EWearableType)notification["payload"]["wearable_type"].asInteger();
 	switch(option)
 	{
@@ -1639,7 +1640,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
 				// Bring up modal dialog: Save changes? Yes, No, Cancel
 				LLSD payload;
 				payload["item_id"] = new_item->getUUID();
-				LLNotifications::instance().add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable));
+				LLNotificationsUtil::add("WearableSave", LLSD(), payload, boost::bind(onSetWearableDialog, _1, _2, new_wearable));
 				return;
 			}
 		}
@@ -1651,7 +1652,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
 // static 
 bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD& response, LLWearable* wearable)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
 	if (!new_item)
 	{
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 6288088210f3a3988980a1008be25b7408f40cd7..c7f05d99f7f403bc7bd7caccaa3abb29edd96e29 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -39,7 +39,7 @@
 #include "llgesturemgr.h"
 #include "llinventorybridge.h"
 #include "llinventoryobserver.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llsidepanelappearance.h"
 #include "llsidetray.h"
 #include "llvoavatar.h"
@@ -637,7 +637,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()
 	
 	if( !wear_items.count() && !obj_items.count() && !gest_items.count())
 	{
-		LLNotifications::instance().add("CouldNotPutOnOutfit");
+		LLNotificationsUtil::add("CouldNotPutOnOutfit");
 		return;
 	}
 		
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 3e10c4b2b076551e42b332d9b22f70402adf3bf1..eb08707b61320f0396143c6e1c9c56c12d39f80f 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -90,6 +90,8 @@
 #include "llvolumemgr.h"
 
 #include "llnotificationmanager.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 // Third party library includes
 #include <boost/bind.hpp>
@@ -866,7 +868,7 @@ bool LLAppViewer::init()
 
 		if (LLFeatureManager::getInstance()->getGPUClass() == GPU_CLASS_UNKNOWN)
 		{
-			LLNotifications::instance().add("UnknownGPU");
+			LLNotificationsUtil::add("UnknownGPU");
 		} 
 			
 		if(unsupported)
@@ -875,7 +877,7 @@ bool LLAppViewer::init()
 				|| gSavedSettings.getBOOL("WarnUnsupportedHardware"))
 			{
 				args["MINSPECS"] = minSpecs;
-				LLNotifications::instance().add("UnsupportedHardware", args );
+				LLNotificationsUtil::add("UnsupportedHardware", args );
 			}
 
 		}
@@ -905,6 +907,7 @@ static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
 static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
 static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");
 static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread");
+static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");
 static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");
 static LLFastTimer::DeclareTimer FTM_IDLE("Idle");
 static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
@@ -1121,6 +1124,10 @@ bool LLAppViewer::mainLoop()
 						LLFastTimer ftm(FTM_VFS);
 	 					io_pending += LLVFSThread::updateClass(1);
 					}
+					{
+						LLFastTimer ftm(FTM_LFS);
+	 					io_pending += LLLFSThread::updateClass(1);
+					}
 
 					if (io_pending > 1000)
 					{
@@ -2857,7 +2864,7 @@ void LLAppViewer::requestQuit()
 
 static bool finish_quit(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (option == 0)
 	{
@@ -2869,7 +2876,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
 
 void LLAppViewer::userQuit()
 {
-	LLNotifications::instance().add("ConfirmQuit");
+	LLNotificationsUtil::add("ConfirmQuit");
 }
 
 static bool finish_early_exit(const LLSD& notification, const LLSD& response)
@@ -2882,7 +2889,7 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions)
 {
    	llwarns << "app_early_exit: " << name << llendl;
 	gDoDisconnect = TRUE;
-	LLNotifications::instance().add(name, substitutions, LLSD(), finish_early_exit);
+	LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit);
 }
 
 void LLAppViewer::forceExit(S32 arg)
@@ -3200,7 +3207,7 @@ std::string LLAppViewer::getWindowTitle() const
 // Callback from a dialog indicating user was logged out.  
 bool finish_disconnect(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (1 == option)
 	{
@@ -3240,12 +3247,12 @@ void LLAppViewer::forceDisconnect(const std::string& mesg)
 	{
 		// Tell users what happened
 		args["ERROR_MESSAGE"] = big_reason;
-		LLNotifications::instance().add("ErrorMessage", args, LLSD(), &finish_forced_disconnect);
+		LLNotificationsUtil::add("ErrorMessage", args, LLSD(), &finish_forced_disconnect);
 	}
 	else
 	{
 		args["MESSAGE"] = big_reason;
-		LLNotifications::instance().add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
+		LLNotificationsUtil::add("YouHaveBeenLoggedOut", args, LLSD(), &finish_disconnect );
 	}
 }
 
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 38843c72215f3f96d499c2d25b886b25590b3cab..d5f9f7ca5d56ac21323fb910c714706010ea59d0 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -63,6 +63,7 @@
 #include "lleconomy.h"
 #include "llfloaterreg.h"
 #include "llfocusmgr.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistctrl.h"
 #include "llsdserialize.h"
 #include "llvfs.h"
@@ -120,14 +121,14 @@ void LLAssetUploadResponder::error(U32 statusNum, const std::string& reason)
 			args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
 			args["REASON"] = "Error in upload request.  Please visit "
 				"http://secondlife.com/support for help fixing this problem.";
-			LLNotifications::instance().add("CannotUploadReason", args);
+			LLNotificationsUtil::add("CannotUploadReason", args);
 			break;
 		case 500:
 		default:
 			args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
 			args["REASON"] = "The server is experiencing unexpected "
 				"difficulties.";
-			LLNotifications::instance().add("CannotUploadReason", args);
+			LLNotificationsUtil::add("CannotUploadReason", args);
 			break;
 	}
 	LLUploadDialog::modalUploadFinished();
@@ -189,7 +190,7 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
 		LLSD args;
 		args["FILE"] = (mFileName.empty() ? mVFileID.asString() : mFileName);
 		args["REASON"] = content["message"].asString();
-		LLNotifications::instance().add("CannotUploadReason", args);
+		LLNotificationsUtil::add("CannotUploadReason", args);
 	}
 }
 
@@ -232,7 +233,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
 
 		LLSD args;
 		args["AMOUNT"] = llformat("%d", expected_upload_cost);
-		LLNotifications::instance().add("UploadPayment", args);
+		LLNotificationsUtil::add("UploadPayment", args);
 	}
 
 	// Actually add the upload to viewer inventory
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index b08191ce158594851ccacc9556f05538b2d4a65b..a7a6da3ac21f09196c5732d6d29d0c2d9b22f097 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -38,6 +38,7 @@
 #include "llsd.h"
 #include "lldarray.h"
 #include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 #include "roles_constants.h"    // for GP_MEMBER_INVITE
 
@@ -69,7 +70,7 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin
 {
 	if(id == gAgentID)
 	{
-		LLNotifications::instance().add("AddSelfFriend");
+		LLNotificationsUtil::add("AddSelfFriend");
 		return;
 	}
 
@@ -83,11 +84,11 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin
 	{
 		// Old and busted server version, doesn't support friend
 		// requests with messages.
-    	LLNotifications::instance().add("AddFriend", args, payload, &callbackAddFriend);
+    	LLNotificationsUtil::add("AddFriend", args, payload, &callbackAddFriend);
 	}
 	else
 	{
-    	LLNotifications::instance().add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);
+    	LLNotificationsUtil::add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage);
 	}
 
 	// add friend to recent people list
@@ -149,7 +150,7 @@ void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)
 		payload["ids"].append(*it);
 	}
 
-	LLNotifications::instance().add(msgType,
+	LLNotificationsUtil::add(msgType,
 		args,
 		payload,
 		&handleRemove);
@@ -380,7 +381,7 @@ void LLAvatarActions::inviteToGroup(const LLUUID& id)
 // static
 bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	const LLSD& ids = notification["payload"]["ids"];
 	for (LLSD::array_const_iterator itr = ids.beginArray(); itr != ids.endArray(); ++itr)
@@ -414,7 +415,7 @@ bool LLAvatarActions::handleRemove(const LLSD& notification, const LLSD& respons
 // static
 bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		gAgent.clearBusy();
@@ -437,7 +438,7 @@ void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id)
 // static
 bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		requestFriendship(notification["payload"]["id"].asUUID(), 
@@ -450,7 +451,7 @@ bool LLAvatarActions::callbackAddFriendWithMessage(const LLSD& notification, con
 // static
 bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		// Servers older than 1.25 require the text of the message to be the
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 327d80ba34e7db1692696bac685f49779a623698..8f3eba98a692b08907a4a2c9ba6c5aebe625cbac 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -234,6 +234,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
 			// Check if cache already contains image_id for that avatar
 			if (!updateFromCache())
 			{
+				LLIconCtrl::setValue(mDefaultIconName);
 				app->addObserver(mAvatarId, this);
 				app->sendAvatarPropertiesRequest(mAvatarId);
 			}
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index bb03f47f46f4207e8c8668e1822787b45b36ba1c..202fbdebd4dd917c109ea70e9ab0d3c02a44b414 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -153,6 +153,13 @@ void LLAvatarList::draw()
 	}
 }
 
+//virtual
+void LLAvatarList::clear()
+{
+	getIDs().clear();
+	setDirty(true);
+}
+
 void LLAvatarList::setNameFilter(const std::string& filter)
 {
 	if (mNameFilter != filter)
@@ -363,37 +370,6 @@ void LLAvatarList::computeDifference(
 	vadded.erase(it, vadded.end());
 }
 
-static std::string format_secs(S32 secs)
-{
-	// *TODO: reinventing the wheel?
-	// *TODO: i18n
-	static const int LL_AL_MIN		= 60;
-	static const int LL_AL_HOUR		= LL_AL_MIN * 60;
-	static const int LL_AL_DAY		= LL_AL_HOUR * 24;
-	static const int LL_AL_WEEK		= LL_AL_DAY * 7;
-	static const int LL_AL_MONTH	= LL_AL_DAY * 31;
-	static const int LL_AL_YEAR		= LL_AL_DAY * 365;
-
-    std::string s;
-
-    if (secs >= LL_AL_YEAR)
-        s = llformat("%dy", secs / LL_AL_YEAR);
-    else if (secs >= LL_AL_MONTH)
-        s = llformat("%dmon", secs / LL_AL_MONTH);
-    else if (secs >= LL_AL_WEEK)
-        s = llformat("%dw", secs / LL_AL_WEEK);
-    else if (secs >= LL_AL_DAY)
-        s = llformat("%dd", secs / LL_AL_DAY);
-    else if (secs >= LL_AL_HOUR)
-        s = llformat("%dh", secs / LL_AL_HOUR);
-    else if (secs >= LL_AL_MIN)
-        s = llformat("%dm", secs / LL_AL_MIN);
-    else
-        s = llformat("%ds", secs);
-
-    return s;
-}
-
 // Refresh shown time of our last interaction with all listed avatars.
 void LLAvatarList::updateLastInteractionTimes()
 {
@@ -407,7 +383,7 @@ void LLAvatarList::updateLastInteractionTimes()
 		LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
 		S32 secs_since = now - (S32) LLRecentPeople::instance().getDate(item->getAvatarId()).secondsSinceEpoch();
 		if (secs_since >= 0)
-			item->setLastInteractionTime(format_secs(secs_since));
+			item->setLastInteractionTime(secs_since);
 	}
 }
 
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 490f93e5015e2e96b2118a9d4b5374d105435422..9058fec540a8ff78bf98f1ba5b9d79789942c453 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -70,6 +70,8 @@ class LLAvatarList : public LLFlatListView
 
 	virtual void draw(); // from LLView
 
+	virtual void clear();
+
 	void setNameFilter(const std::string& filter);
 	void setDirty(bool val = true)						{ mDirty = val; }
 	uuid_vector_t& getIDs() 							{ return mIDs; }
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index c670a65bcc0e968909ac12dab1fbe1c9ab6d9b62..efc9538fa6dac5fb47b1186d855563d15cdb8b37 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -198,9 +198,9 @@ void LLAvatarListItem::showLastInteractionTime(bool show)
 	mAvatarName->setRect(name_rect);
 }
 
-void LLAvatarListItem::setLastInteractionTime(const std::string& val)
+void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
 {
-	mLastInteractionTime->setValue(val);
+	mLastInteractionTime->setValue(formatSeconds(secs_since));
 }
 
 void LLAvatarListItem::setShowInfoBtn(bool show)
@@ -326,3 +326,51 @@ void LLAvatarListItem::reshapeAvatarName()
 
 	mAvatarName->reshape(width, height);
 }
+
+// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
+// taking i18n into account. The format string to use is taken from the panel XML.
+std::string LLAvatarListItem::formatSeconds(U32 secs)
+{
+	static const U32 LL_ALI_MIN		= 60;
+	static const U32 LL_ALI_HOUR	= LL_ALI_MIN	* 60;
+	static const U32 LL_ALI_DAY		= LL_ALI_HOUR	* 24;
+	static const U32 LL_ALI_WEEK	= LL_ALI_DAY	* 7;
+	static const U32 LL_ALI_MONTH	= LL_ALI_DAY	* 30;
+	static const U32 LL_ALI_YEAR	= LL_ALI_DAY	* 365;
+
+	std::string fmt; 
+	U32 count = 0;
+
+	if (secs >= LL_ALI_YEAR)
+	{
+		fmt = "FormatYears"; count = secs / LL_ALI_YEAR;
+	}
+	else if (secs >= LL_ALI_MONTH)
+	{
+		fmt = "FormatMonths"; count = secs / LL_ALI_MONTH;
+	}
+	else if (secs >= LL_ALI_WEEK)
+	{
+		fmt = "FormatWeeks"; count = secs / LL_ALI_WEEK;
+	}
+	else if (secs >= LL_ALI_DAY)
+	{
+		fmt = "FormatDays"; count = secs / LL_ALI_DAY;
+	}
+	else if (secs >= LL_ALI_HOUR)
+	{
+		fmt = "FormatHours"; count = secs / LL_ALI_HOUR;
+	}
+	else if (secs >= LL_ALI_MIN)
+	{
+		fmt = "FormatMinutes"; count = secs / LL_ALI_MIN;
+	}
+	else
+	{
+		fmt = "FormatSeconds"; count = secs;
+	}
+
+	LLStringUtil::format_map_t args;
+	args["[COUNT]"] = llformat("%u", count);
+	return getString(fmt, args);
+}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 9d48101a44caa63d9dc04ce9ff96f05f6ad75573..341f5a6bcf6ab667a73f57a37c0e19756350d9a5 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -63,7 +63,7 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 	void setOnline(bool online);
 	void setName(const std::string& name);
 	void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
-	void setLastInteractionTime(const std::string& val);
+	void setLastInteractionTime(U32 secs_since);
 	//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
 	void setShowProfileBtn(bool show);
 	void setShowInfoBtn(bool show);
@@ -94,6 +94,8 @@ class LLAvatarListItem : public LLPanel, public LLFriendObserver
 
 	void onNameCache(const std::string& first_name, const std::string& last_name);
 
+	std::string formatSeconds(U32 secs);
+
 	LLAvatarIconCtrl* mAvatarIcon;
 	LLTextBox* mAvatarName;
 	LLTextBox* mLastInteractionTime;
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index c4f0fa53a79c21f8ccea2a8cbcadb154983dde40..9cc7b8c78536e0d808125418bf6a75579576d66b 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -40,6 +40,7 @@
 #include "llimfloater.h" // for LLIMFloater
 #include "lllayoutstack.h"
 #include "llnearbychatbar.h"
+#include "llnotificationsutil.h"
 #include "llspeakbutton.h"
 #include "llsplitbutton.h"
 #include "llsyswellwindow.h"
@@ -941,7 +942,7 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
 	{
 		// mark this button to show it while future bottom tray extending
 		mResizeState |= shown_object_type;
-		LLNotifications::instance().add("BottomTrayButtonCanNotBeShown");
+		LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown");
 	}
 }
 
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1b929eca0e7ac0de5bf81952b98db47f030420df
--- /dev/null
+++ b/indra/newview/llcallfloater.cpp
@@ -0,0 +1,199 @@
+/** 
+ * @file llcallfloater.cpp
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcallfloater.h"
+
+#include "llagentdata.h" // for gAgentID
+#include "llavatarlist.h"
+#include "llbottomtray.h"
+#include "llparticipantlist.h"
+#include "llspeakers.h"
+
+
+LLCallFloater::LLCallFloater(const LLSD& key)
+: LLDockableFloater(NULL, key)
+, mSpeakerManager(NULL)
+, mPaticipants(NULL)
+, mAvatarList(NULL)
+, mVoiceType(VC_LOCAL_CHAT)
+{
+
+}
+
+LLCallFloater::~LLCallFloater()
+{
+	delete mPaticipants;
+	mPaticipants = NULL;
+}
+
+// virtual
+BOOL LLCallFloater::postBuild()
+{
+	LLDockableFloater::postBuild();
+	mAvatarList = getChild<LLAvatarList>("speakers_list");
+
+
+	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+
+	setDockControl(new LLDockControl(
+		anchor_panel, this,
+		getDockTongue(), LLDockControl::TOP));
+
+	initAgentData();
+
+	// update list for current session
+	updateSession();
+
+	// subscribe to to be notified Voice Channel is changed
+	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1));
+	return TRUE;
+}
+
+// virtual
+void LLCallFloater::onOpen(const LLSD& /*key*/)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+void LLCallFloater::updateSession()
+{
+	LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+	if (voice_channel)
+	{
+		lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl;
+
+		if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID())
+		{
+			lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl;
+			return;
+		}
+		else
+		{
+			mSpeakerManager = NULL;
+		}
+	}
+
+	const LLUUID& session_id = voice_channel->getSessionID();
+	lldebugs << "Set speaker manager for session: " << session_id << llendl;
+
+	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+	if (im_session)
+	{
+		mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+		switch (im_session->mType)
+		{
+		case IM_NOTHING_SPECIAL:
+		case IM_SESSION_P2P_INVITE:
+			mVoiceType = VC_PEER_TO_PEER;
+			break;
+		case IM_SESSION_CONFERENCE_START:
+			mVoiceType = VC_AD_HOC_CHAT;
+			break;
+		default:
+			mVoiceType = VC_GROUP_CHAT;
+			break;
+		}
+	}
+
+	if (NULL == mSpeakerManager)
+	{
+		// by default let show nearby chat participants
+		mSpeakerManager = LLLocalSpeakerMgr::getInstance();
+		lldebugs << "Set DEFAULT speaker manager" << llendl;
+		mVoiceType = VC_LOCAL_CHAT;
+	}
+
+	updateTitle();
+	refreshPartisipantList();
+}
+
+void LLCallFloater::refreshPartisipantList()
+{
+	delete mPaticipants;
+	mAvatarList->clear();
+
+	bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager;
+	mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat);
+
+	if (!do_not_use_context_menu_in_local_chat)
+	{
+		mAvatarList->setNoItemsCommentText(getString("no_one_near"));
+	}
+}
+
+void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
+{
+	updateSession();
+}
+
+void LLCallFloater::updateTitle()
+{
+	LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+	std::string title;
+	switch (mVoiceType)
+	{
+	case VC_LOCAL_CHAT:
+		title = getString("title_nearby");
+		break;
+	case VC_PEER_TO_PEER:
+		title = voice_channel->getSessionName();
+		break;
+	case VC_AD_HOC_CHAT:
+		title = getString("title_adhoc");
+		break;
+	case VC_GROUP_CHAT:
+		LLStringUtil::format_map_t args;
+		args["[GROUP]"] = voice_channel->getSessionName();
+		title = getString("title_group", args);
+		break;
+	}
+
+	setTitle(title);
+}
+
+void LLCallFloater::initAgentData()
+{
+	childSetValue("user_icon", gAgentID);
+
+	std::string name;
+	gCacheName->getFullName(gAgentID, name);
+	childSetValue("user_text", name);
+
+	LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+	speaking_indicator->setSpeakerId(gAgentID);
+}
+//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
new file mode 100644
index 0000000000000000000000000000000000000000..8a440873ff1a070c61d2ca8af4385334d5d41ebc
--- /dev/null
+++ b/indra/newview/llcallfloater.h
@@ -0,0 +1,97 @@
+/** 
+ * @file llcallfloater.h
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * 
+ * Copyright (c) 2009, Linden Research, Inc.
+ * 
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * 
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * 
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ * 
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCALLFLOATER_H
+#define LL_LLCALLFLOATER_H
+
+#include "lldockablefloater.h"
+
+class LLAvatarList;
+class LLParticipantList;
+class LLSpeakerMgr;
+
+/**
+ * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
+ * It can be torn-off and freely positioned onscreen.
+ *
+ * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over 
+ * the Resident's own microphone input volume, the audible volume of each of the other participants,
+ * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
+ *
+ * When the Resident is engaged in Group Voice Chat, the Voice Control Panel also provides an 
+ * 'End Call' button to allow the Resident to leave that voice channel.
+ */
+class LLCallFloater : public LLDockableFloater
+{
+public:
+	LLCallFloater(const LLSD& key);
+	~LLCallFloater();
+
+	/*virtual*/ BOOL postBuild();
+	/*virtual*/ void onOpen(const LLSD& key);
+
+private:
+	typedef enum e_voice_controls_type
+	{
+		VC_LOCAL_CHAT,
+		VC_GROUP_CHAT,
+		VC_AD_HOC_CHAT,
+		VC_PEER_TO_PEER
+	}EVoiceControls;
+
+	/**
+	 * Updates mSpeakerManager and list according to current Voice Channel
+	 *
+	 * It compares mSpeakerManager & current Voice Channel session IDs.
+	 * If they are different gets Speaker manager related to current channel and updates channel participant list.
+	 */
+	void updateSession();
+
+	/**
+	 * Refreshes participant list according to current Voice Channel
+	 */
+	void refreshPartisipantList();
+	void onCurrentChannelChanged(const LLUUID& session_id);
+	void updateTitle();
+	void initAgentData();
+
+private:
+	LLSpeakerMgr* mSpeakerManager;
+	LLParticipantList* mPaticipants;
+	LLAvatarList* mAvatarList;
+	EVoiceControls mVoiceType;
+};
+
+
+#endif //LL_LLCALLFLOATER_H
+
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 0b10255c2f2395b8aa224dbe655fde71a90cd272..714bd20ab888ab34f32119109590b5d874a3d4c6 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -53,6 +53,8 @@
 #include "llbutton.h"
 #include "llinventoryobserver.h"
 #include "llinventorymodel.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llresmgr.h"
 #include "llimview.h"
@@ -631,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
 			{
 				if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^  new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
 				{
-					std::string first, last;
+					std::string name;
 					LLSD args;
-					if(gCacheName->getName(agent_id, first, last))
+					if(gCacheName->getFullName(agent_id, name))
 					{
-						args["FIRST_NAME"] = first;
-						args["LAST_NAME"] = last;	
+						args["NAME"] = name;
 					}
+					LLSD payload;
+					payload["from_id"] = agent_id;
 					if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
 					{
-						LLNotifications::instance().add("GrantedModifyRights",args);
+						LLNotificationsUtil::add("GrantedModifyRights",args, payload);
 					}
 					else
 					{
-						LLNotifications::instance().add("RevokedModifyRights",args);
+						LLNotificationsUtil::add("RevokedModifyRights",args, payload);
 					}
 				}
 				(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
@@ -714,7 +717,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
 		if(notify)
 		{
 			// Popup a notify box with online status of this agent
-			LLNotificationPtr notification = LLNotifications::instance().add(online ? "FriendOnline" : "FriendOffline", args);
+			LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);
 
 			// If there's an open IM session with this agent, send a notification there too.
 			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 2c9b38b82a2fe005d86813e4981f55bd7d7bb14c..078c2518c6f76c5e56e196e37629a0bd6df43d1a 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -199,7 +199,7 @@ class LLChatHistoryHeader: public LLPanel
 			userName->setValue(SL);
 		}
 
-		setTimeField(chat.mTimeStr);
+		setTimeField(chat);
 		
 		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
 
@@ -267,11 +267,29 @@ class LLChatHistoryHeader: public LLPanel
 	}
 
 private:
-	void setTimeField(const std::string& time_value)
+	std::string appendTime(const LLChat& chat)
+	{
+		time_t utc_time;
+		utc_time = time_corrected();
+		std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+			+LLTrans::getString("TimeMin")+"] ";
+
+		LLSD substitution;
+
+		substitution["datetime"] = (S32) utc_time;
+		LLStringUtil::format (timeStr, substitution);
+
+		return timeStr;
+	}
+
+	void setTimeField(const LLChat& chat)
 	{
 		LLTextBox* time_box = getChild<LLTextBox>("time_box");
 
 		LLRect rect_before = time_box->getRect();
+
+		std::string time_value = appendTime(chat);
+
 		time_box->setValue(time_value);
 
 		// set necessary textbox width to fit all text
@@ -284,7 +302,7 @@ class LLChatHistoryHeader: public LLPanel
 		time_box->translate(delta_pos_x, delta_pos_y);
 
 		//... & change width of the name control
-		LLTextBox* user_name = getChild<LLTextBox>("user_name");
+		LLView* user_name = getChild<LLView>("user_name");
 		const LLRect& user_rect = user_name->getRect();
 		user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
 	}
@@ -386,7 +404,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 		p.left_pad = mLeftWidgetPad;
 		p.right_pad = mRightWidgetPad;
 
-		if (mLastFromName == chat.mFromName)
+		LLDate new_message_time = LLDate::now();
+
+		if (mLastFromName == chat.mFromName && 
+			mLastMessageTime.notNull() &&
+			(new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0 )
 		{
 			view = getSeparator();
 			p.top_pad = mTopSeparatorPad;
@@ -414,6 +436,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
 
 		appendWidget(p, header_text, false);
 		mLastFromName = chat.mFromName;
+		mLastMessageTime = new_message_time;
 	}
 	//Handle IRC styled /me messages.
 	std::string prefix = chat.mText.substr(0, 4);
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index ef5839ff2f7a480140e2ba928824eb9de8b0ac2c..d2cfa53d8b7a690c1ba0675f9039abbb3df95f52 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -114,6 +114,7 @@ class LLChatHistory : public LLTextEditor
 
 	private:
 		std::string mLastFromName;
+		LLDate mLastMessageTime;
 		std::string mMessageHeaderFilename;
 		std::string mMessageSeparatorFilename;
 
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 8a6935b71bf91d9b9767c6540de1d099c2221d5d..efdaff3f6ac3d2bfa33a6afee4f9519ad4609f9f 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -44,27 +44,12 @@
 #include "llviewercontrol.h"
 #include "llagentdata.h"
 
-/*
-static const S32 BORDER_MARGIN = 2;
-static const S32 PARENT_BORDER_MARGIN = 0;
-
-static const S32 HORIZONTAL_MULTIPLE = 8;
-static const S32 VERTICAL_MULTIPLE = 16;
-static const F32 MIN_AUTO_SCROLL_RATE = 120.f;
-static const F32 MAX_AUTO_SCROLL_RATE = 500.f;
-static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
-
-#define MAX_CHAT_HISTORY 100
-*/
-
-static const S32 msg_left_offset = 30;
+static const S32 msg_left_offset = 10;
 static const S32 msg_right_offset = 10;
-static const S32 msg_height_pad = 2;
-
-//static LLDefaultChildRegistry::Register<LLChatItemsContainerCtrl>	t2("chat_items_container");
+static const S32 msg_height_pad = 5;
 
 //*******************************************************************************************************************
-//LLChatItemCtrl
+//LLNearbyChatToastPanel
 //*******************************************************************************************************************
 
 LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
@@ -79,22 +64,22 @@ void	LLNearbyChatToastPanel::reshape		(S32 width, S32 height, BOOL called_from_p
 {
 	LLPanel::reshape(width, height,called_from_parent);
 
-	// *NOTE: we must check if child items exist because reshape is called from the 
-	// LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet
-	LLPanel* caption = findChild<LLPanel>("msg_caption", false);
-	LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text" ,false);
-	if(caption && msg_text)
-	{
-		LLRect caption_rect = caption->getRect();
-		caption_rect.setLeftTopAndSize( 2, height, width - 4, caption_rect.getHeight());
-		caption->reshape( width - 4, caption_rect.getHeight(), 1);
-		caption->setRect(caption_rect);
-
-		LLRect msg_text_rect = msg_text->getRect();
-		msg_text_rect.setLeftTopAndSize( msg_left_offset, height - caption_rect.getHeight() , width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight());
-		msg_text->reshape( width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight(), 1);
-		msg_text->setRect(msg_text_rect);
-	}
+	LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
+	LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+
+	LLRect msg_text_rect = msg_text->getRect();
+	LLRect avatar_rect = icon->getRect();
+	
+	avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight());
+	icon->setRect(avatar_rect);
+
+
+	msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset, 
+		height - msg_height_pad, 
+		width - avatar_rect.mRight  - msg_left_offset - msg_right_offset, 
+		height - 2*msg_height_pad);
+	msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1);
+	msg_text->setRect(msg_text_rect);
 }
 
 BOOL LLNearbyChatToastPanel::postBuild()
@@ -102,37 +87,63 @@ BOOL LLNearbyChatToastPanel::postBuild()
 	return LLPanel::postBuild();
 }
 
-
-std::string LLNearbyChatToastPanel::appendTime()
+void LLNearbyChatToastPanel::addMessage(LLSD& notification)
 {
-	time_t utc_time;
-	utc_time = time_corrected();
-	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
-		+LLTrans::getString("TimeMin")+"] ";
+	std::string		messageText = notification["message"].asString();		// UTF-8 line of text
 
-	LLSD substitution;
+	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
 
-	substitution["datetime"] = (S32) utc_time;
-	LLStringUtil::format (timeStr, substitution);
+	std::string color_name = notification["text_color"].asString();
+	
+	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+	textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+	
+	S32 font_size = notification["font_size"].asInteger();
 
-	return timeStr;
-}
+	LLFontGL*       messageFont;
+	switch(font_size)
+	{
+		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break;
+		default:
+		case 1: messageFont = LLFontGL::getFontSansSerif();	    break;
+		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break;
+	}
 
+	//append text
+	{
+		LLStyle::Params style_params;
+		style_params.color(textColor);
+		std::string font_name = LLFontGL::nameFromFont(messageFont);
+		std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+		style_params.font.name(font_name);
+		style_params.font.size(font_style_size);
 
+		int chat_type = notification["chat_type"].asInteger();
+
+		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+		{
+			messageText = messageText.substr(3);
+			style_params.font.style = "ITALIC";
+		}
+		else if( chat_type == CHAT_TYPE_SHOUT)
+		{
+			style_params.font.style = "BOLD";
+		}
+		else if( chat_type == CHAT_TYPE_WHISPER)
+		{
+			style_params.font.style = "ITALIC";
+		}
+		msg_text->appendText(messageText, TRUE, style_params);
+	}
+
+	snapToMessageHeight();
 
-void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params)
-{
-	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	msg_text->addText(message , input_params);
-	mMessages.push_back(message);
 }
 
 void LLNearbyChatToastPanel::init(LLSD& notification)
 {
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
-	mText = notification["message"].asString();		// UTF-8 line of text
-	mFromName = notification["from"].asString();	// agent or object name
+	std::string		messageText = notification["message"].asString();		// UTF-8 line of text
+	std::string		fromName = notification["from"].asString();	// agent or object name
 	mFromID = notification["from_id"].asUUID();		// agent id or object id
 	
 	int sType = notification["source"].asInteger();
@@ -140,192 +151,121 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
 	
 	std::string color_name = notification["text_color"].asString();
 	
-	mTextColor = LLUIColorTable::instance().getColor(color_name);
-	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal();
+	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+	textColor.mV[VALPHA] =notification["color_alpha"].asReal();
 	
 	S32 font_size = notification["font_size"].asInteger();
+
+	LLFontGL*       messageFont;
 	switch(font_size)
 	{
-		case 0:
-			mFont = LLFontGL::getFontSansSerifSmall();
-			break;
+		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break;
 		default:
-		case 1:
-			mFont = LLFontGL::getFontSansSerif();
-			break;
-		case 2:
-			mFont = LLFontGL::getFontSansSerifBig();
-			break;
+		case 1: messageFont = LLFontGL::getFontSansSerif();	    break;
+		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break;
 	}
 	
-	LLStyle::Params style_params;
-	style_params.color(mTextColor);
-//	style_params.font(mFont);
-	std::string font_name = LLFontGL::nameFromFont(mFont);
-	std::string font_style_size = LLFontGL::sizeFromFont(mFont);
-	style_params.font.name(font_name);
-	style_params.font.size(font_style_size);
+	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+
+	msg_text->setText(std::string(""));
 
 	std::string str_sender;
 	
 	if(gAgentID != mFromID)
-		str_sender = mFromName;
+		str_sender = fromName;
 	else
-		str_sender = LLTrans::getString("You");;
+		str_sender = LLTrans::getString("You");
 
-	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
-	
-	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+	str_sender+=" ";
 
+	//append user name
+	{
+		LLStyle::Params style_params_name;
+
+		LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor");
+
+		style_params_name.color(userNameColor);
+		
+		std::string font_name = LLFontGL::nameFromFont(messageFont);
+		std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+		style_params_name.font.name(font_name);
+		style_params_name.font.size(font_style_size);
+		
+		msg_text->appendText(str_sender, FALSE, style_params_name);
+		
+	}
 
-	if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+	//append text
 	{
-		if (mFromName.size() > 0)
+		LLStyle::Params style_params;
+		style_params.color(textColor);
+		std::string font_name = LLFontGL::nameFromFont(messageFont);
+		std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+		style_params.font.name(font_name);
+		style_params.font.size(font_style_size);
+
+		int chat_type = notification["chat_type"].asInteger();
+
+		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
 		{
+			messageText = messageText.substr(3);
 			style_params.font.style = "ITALIC";
-			
-			msg_text->setText(mFromName, style_params);
 		}
-		mText = mText.substr(3);
-		style_params.font.style = "ITALIC";
-#define INFINITE_REFLOW_BUG 0
-#if INFINITE_REFLOW_BUG
-		// This causes LLTextBase::reflow() to infinite loop until the viewer
-		// runs out of memory, throws a bad_alloc exception from std::vector
-		// in mLineInfoList, and the main loop catches it and continues.
-		// It appears to be caused by addText() adding a line separator in the
-		// middle of a line.  See EXT-2579, EXT-1949
-		msg_text->addText(mText,style_params);
-#else
-		msg_text->appendText(mText, FALSE, style_params);
-#endif
-	}
-	else 
-	{
-		msg_text->setText(mText, style_params);
+		else if( chat_type == CHAT_TYPE_SHOUT)
+		{
+			style_params.font.style = "BOLD";
+		}
+		else if( chat_type == CHAT_TYPE_WHISPER)
+		{
+			style_params.font.style = "ITALIC";
+		}
+		msg_text->appendText(messageText, FALSE, style_params);
 	}
 
 
-	
-	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
-	if(mSourceType != CHAT_SOURCE_AGENT)
-		msg_inspector->setVisible(false);
-
-	mMessages.clear();
-
-	snapToMessageHeight	();
+	snapToMessageHeight();
 
 	mIsDirty = true;//will set Avatar Icon in draw
 }
 
-void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg)
-{
-	LLSD notification;
-	notification["message"] = chat_msg.mText;
-	notification["from"] = chat_msg.mFromName;
-	notification["from_id"] = chat_msg.mFromID;
-	notification["time"] = chat_msg.mTime;
-	notification["source"] = (S32)chat_msg.mSourceType;
-	notification["chat_type"] = (S32)chat_msg.mChatType;
-	notification["chat_style"] = (S32)chat_msg.mChatStyle;
-	
-	std::string r_color_name="White";
-	F32 r_color_alpha = 1.0f; 
-	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
-	
-	notification["text_color"] = r_color_name;
-	notification["color_alpha"] = r_color_alpha;
-	
-	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
-	init(notification);
-
-}
-
 void	LLNearbyChatToastPanel::snapToMessageHeight	()
 {
 	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
-	S32 new_height = text_box->getTextPixelHeight() + msg_height_pad;
+	S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
+	
 	LLRect panel_rect = getRect();
 
-	S32 caption_height = 0;
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-	caption_height = caption->getRect().getHeight();
-
-	panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), caption_height + new_height);
+	panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height);
 	
-	reshape( getRect().getWidth(), caption_height + new_height, 1);
+	reshape( getRect().getWidth(), getRect().getHeight(), 1);
 	
 	setRect(panel_rect);
 
 }
 
-
-void	LLNearbyChatToastPanel::setWidth(S32 width)
-{
-	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
-	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);
-
-	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-	
-	LLStyle::Params style_params;
-	style_params.color(mTextColor);
-	style_params.font(mFont);
-	
-	
-	if(mText.length())
-		msg_text->setText(mText, style_params);
-	
-	for(size_t i=0;i<mMessages.size();++i)
-		msg_text->addText(mMessages[i] , style_params);
-
-	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom));
-	snapToMessageHeight	();
-}
-
 void LLNearbyChatToastPanel::onMouseLeave			(S32 x, S32 y, MASK mask)
 {
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
-	msg_inspector->setVisible(false);
 	
 }
 void LLNearbyChatToastPanel::onMouseEnter				(S32 x, S32 y, MASK mask)
 {
 	if(mSourceType != CHAT_SOURCE_AGENT)
 		return;
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
-	msg_inspector->setVisible(true);
 }
 
 BOOL	LLNearbyChatToastPanel::handleMouseDown	(S32 x, S32 y, MASK mask)
 {
 	if(mSourceType != CHAT_SOURCE_AGENT)
 		return LLPanel::handleMouseDown(x,y,mask);
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
-	S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft;
-	S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom;
-	if(msg_inspector->pointInView(local_x, local_y))
-	{
-		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mFromID));
-	}
-	else
-	{
-		LLFloaterReg::showInstance("nearby_chat",LLSD());
-	}
+	LLFloaterReg::showInstance("nearby_chat",LLSD());
 	return LLPanel::handleMouseDown(x,y,mask);
 }
 
 void	LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
 {
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
-	LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon", false);
-	LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name", false);
-
-	icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
-	name->setVisible(e == CHATITEMHEADER_SHOW_ONLY_NAME || e==CHATITEMHEADER_SHOW_BOTH);
+	LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+	if(icon)
+		icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
 
 }
 
@@ -339,11 +279,10 @@ bool	LLNearbyChatToastPanel::canAddText	()
 
 BOOL	LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
 {
-	LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-	LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon", false);
+	LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
 
-	S32 local_x = x - avatar_icon->getRect().mLeft - caption->getRect().mLeft;
-	S32 local_y = y - avatar_icon->getRect().mBottom - caption->getRect().mBottom;
+	S32 local_x = x - avatar_icon->getRect().mLeft;
+	S32 local_y = y - avatar_icon->getRect().mBottom;
 
 	//eat message for avatar icon if msg was from object
 	if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT)
@@ -354,9 +293,12 @@ void LLNearbyChatToastPanel::draw()
 {
 	if(mIsDirty)
 	{
-		LLPanel* caption = findChild<LLPanel>("msg_caption", false);
-		if(caption)
-			caption->getChild<LLAvatarIconCtrl>("avatar_icon", false)->setValue(mFromID);
+		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
+		if(icon)
+		{
+			icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
+			icon->setValue(mFromID);
+		}
 		mIsDirty = false;
 	}
 	LLToastPanelBase::draw();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index a65bfedd0964f61786e2a2539d4beeaab7e672ee..0a85c524015f32cc513474f90762024b385a673f 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -59,9 +59,8 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 
 	const LLUUID& getFromID() const { return mFromID;}
 	
-	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());
-	void	setMessage	(const LLChat& msg);
-	void	setWidth		(S32 width);
+	//void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params());
+	//void	setMessage	(const LLChat& msg);
 	void	snapToMessageHeight	();
 
 	bool	canAddText	();
@@ -78,22 +77,16 @@ class LLNearbyChatToastPanel: public LLToastPanelBase
 	BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);
 
 	virtual void init(LLSD& data);
+	virtual void addMessage(LLSD& data);
 
 	virtual void draw();
-private:
-	
-	std::string appendTime	();
 
+	const LLUUID&	messageID() const { return mFromID;}
 private:
-	std::string		mText;		// UTF-8 line of text
-	std::string		mFromName;	// agent or object name
 	LLUUID			mFromID;	// agent id or object id
 	EChatSourceType	mSourceType;
-	LLColor4        mTextColor;
-	LLFontGL*       mFont;
-
+	
 
-	std::vector<std::string> mMessages;
 
 	bool mIsDirty;
 };
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 90f246ddaffdfdd9a928943b5b314a6d297e443a..f41e326dd00081b657895b4b51454b61e6e7744c 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -32,6 +32,7 @@
 
 #include "llviewerprecompiledheaders.h" // must be first include
 #include "llchiclet.h"
+
 #include "llagent.h"
 #include "llavataractions.h"
 #include "llbottomtray.h"
@@ -42,6 +43,8 @@
 #include "llfloaterreg.h"
 #include "lllocalcliprect.h"
 #include "llmenugl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "lloutputmonitorctrl.h"
 #include "llscriptfloater.h"
 #include "lltextbox.h"
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index 9d3b92d93742a46992564236ee037b5f3a2dc82b..eb9a2fec2fa2e968ab3f5a466c1d7a98107ad84f 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -60,6 +60,7 @@
 #include "llbutton.h"
 #include "lldir.h"
 #include "llfloaterchat.h"
+#include "llnotificationsutil.h"
 #include "llviewerstats.h"
 #include "llvfile.h"
 #include "lluictrlfactory.h"
@@ -480,7 +481,7 @@ void LLFloaterCompileQueue::onSaveTextComplete(const LLUUID& asset_id, void* use
 		llwarns << "Unable to save text for script." << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("CompileQueueSaveText", args);
+		LLNotificationsUtil::add("CompileQueueSaveText", args);
 	}
 }
 
@@ -500,7 +501,7 @@ void LLFloaterCompileQueue::onSaveBytecodeComplete(const LLUUID& asset_id, void*
 		llwarns << "Unable to save bytecode for script." << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("CompileQueueSaveBytecode", args);
+		LLNotificationsUtil::add("CompileQueueSaveBytecode", args);
 	}
 	delete data;
 	data = NULL;
diff --git a/indra/newview/llconfirmationmanager.cpp b/indra/newview/llconfirmationmanager.cpp
index 5813943ad3796a9402cfa20f0cb616df9082404c..4b7333995773a128470873c4282de85e7bbd137d 100644
--- a/indra/newview/llconfirmationmanager.cpp
+++ b/indra/newview/llconfirmationmanager.cpp
@@ -37,7 +37,7 @@
 #include "lluictrlfactory.h"
 
 // viewer includes
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llstring.h"
 #include "llxmlnode.h"
 
@@ -48,7 +48,7 @@ LLConfirmationManager::ListenerBase::~ListenerBase()
 
 static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		listener->confirmed("");
@@ -61,7 +61,7 @@ static bool onConfirmAlert(const LLSD& notification, const LLSD& response, LLCon
 static bool onConfirmAlertPassword(const LLSD& notification, const LLSD& response, LLConfirmationManager::ListenerBase* listener)
 {
 	std::string text = response["message"].asString();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 		
 	if (option == 0)
 	{
@@ -83,11 +83,11 @@ void LLConfirmationManager::confirm(Type type,
 	switch (type)
 	{
 		case TYPE_CLICK:
-			LLNotifications::instance().add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener));
+			LLNotificationsUtil::add("ConfirmPurchase", args, LLSD(), boost::bind(onConfirmAlert, _1, _2, listener));
 		  break;
 
 		case TYPE_PASSWORD:
-			LLNotifications::instance().add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener));
+			LLNotificationsUtil::add("ConfirmPurchasePassword", args, LLSD(), boost::bind(onConfirmAlertPassword, _1, _2, listener));
 		  break;
 		case TYPE_NONE:
 		default:
diff --git a/indra/newview/lldelayedgestureerror.cpp b/indra/newview/lldelayedgestureerror.cpp
index 1af94b350352b42e667774d19819d180212df99e..411cb331a899e76754e9259a05462cae2078fffb 100644
--- a/indra/newview/lldelayedgestureerror.cpp
+++ b/indra/newview/lldelayedgestureerror.cpp
@@ -33,7 +33,9 @@
 
 #include "llviewerprecompiledheaders.h"
 #include "lldelayedgestureerror.h"
+
 #include <list>
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llcallbacklist.h"
 #include "llinventory.h"
@@ -119,7 +121,7 @@ bool LLDelayedGestureError::doDialog(const LLErrorEntry &ent, bool uuid_ok)
 	}
 	 
 
-	LLNotifications::instance().add(ent.mNotifyName, args);
+	LLNotificationsUtil::add(ent.mNotifyName, args);
 
 	return true;
 }
diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp
index da20766e7ee48d389bceb3bbcb4dfe85475627c2..9c8af16535cbbeea70f334bc63bd69587d0a4e33 100644
--- a/indra/newview/lleventnotifier.cpp
+++ b/indra/newview/lleventnotifier.cpp
@@ -34,6 +34,7 @@
 
 #include "lleventnotifier.h"
 
+#include "llnotificationsutil.h"
 #include "message.h"
 
 #include "llnotify.h"
@@ -81,7 +82,7 @@ void LLEventNotifier::update()
 				LLSD args;
 				args["NAME"] = np->getEventName();
 				args["DATE"] = np->getEventDateStr();
-				LLNotifications::instance().add("EventNotification", args, LLSD(),
+				LLNotificationsUtil::add("EventNotification", args, LLSD(),
 					boost::bind(&LLEventNotification::handleResponse, np, _1, _2));
 				mEventNotifications.erase(iter++);
 			}
@@ -185,7 +186,7 @@ LLEventNotification::~LLEventNotification()
 
 bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch (option)
 	{
 	case 0:
diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 893b12ec359a49f97f930ba20537deb63f496d61..0bcdad5da1414baf6b9c344f79b8976228d39a82 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -36,6 +36,7 @@
 
 // library includes
 #include "indra_constants.h"
+#include "llnotificationsutil.h"
 
 // viewer includes
 #include "llagent.h"	// for gAgent.inPrelude()
@@ -86,7 +87,7 @@ void LLFirstUse::useBalanceIncrease(S32 delta)
 
 		LLSD args;
 		args["AMOUNT"] = llformat("%d",delta);
-		LLNotifications::instance().add("FirstBalanceIncrease", args);
+		LLNotificationsUtil::add("FirstBalanceIncrease", args);
 	}
 }
 
@@ -100,7 +101,7 @@ void LLFirstUse::useBalanceDecrease(S32 delta)
 
 		LLSD args;
 		args["AMOUNT"] = llformat("%d",-delta);
-		LLNotifications::instance().add("FirstBalanceDecrease", args);
+		LLNotificationsUtil::add("FirstBalanceDecrease", args);
 	}
 }
 
@@ -114,7 +115,7 @@ void LLFirstUse::useSit()
 	//{
 	//	gWarningSettings.setBOOL("FirstSit", FALSE);
         //
-	//	LLNotifications::instance().add("FirstSit");
+	//	LLNotificationsUtil::add("FirstSit");
 	//}
 }
 
@@ -125,7 +126,7 @@ void LLFirstUse::useMap()
 	{
 		gWarningSettings.setBOOL("FirstMap", FALSE);
 
-		LLNotifications::instance().add("FirstMap");
+		LLNotificationsUtil::add("FirstMap");
 	}
 }
 
@@ -142,7 +143,7 @@ void LLFirstUse::useBuild()
 	{
 		gWarningSettings.setBOOL("FirstBuild", FALSE);
 
-		LLNotifications::instance().add("FirstBuild");
+		LLNotificationsUtil::add("FirstBuild");
 	}
 }
 /*
@@ -153,7 +154,7 @@ void LLFirstUse::useLeftClickNoHit()
 	{
 		gWarningSettings.setBOOL("FirstLeftClickNoHit", FALSE);
 
-		LLNotifications::instance().add("FirstLeftClickNoHit");
+		LLNotificationsUtil::add("FirstLeftClickNoHit");
 	}
 }
 */
@@ -167,7 +168,7 @@ void LLFirstUse::useTeleport()
 		{
 			gWarningSettings.setBOOL("FirstTeleport", FALSE);
 
-		        LLNotifications::instance().add("FirstTeleport");
+		        LLNotificationsUtil::add("FirstTeleport");
 		}
 	}
 }
@@ -183,7 +184,7 @@ void LLFirstUse::useOverrideKeys()
 		{
 			gWarningSettings.setBOOL("FirstOverrideKeys", FALSE);
 
-			LLNotifications::instance().add("FirstOverrideKeys");
+			LLNotificationsUtil::add("FirstOverrideKeys");
 		}
 	}
 }
@@ -201,7 +202,7 @@ void LLFirstUse::useAppearance()
 	{
 		gWarningSettings.setBOOL("FirstAppearance", FALSE);
 
-		LLNotifications::instance().add("FirstAppearance");
+		LLNotificationsUtil::add("FirstAppearance");
 	}
 }
 
@@ -212,7 +213,7 @@ void LLFirstUse::useInventory()
 	{
 		gWarningSettings.setBOOL("FirstInventory", FALSE);
 
-		LLNotifications::instance().add("FirstInventory");
+		LLNotificationsUtil::add("FirstInventory");
 	}
 }
 
@@ -227,7 +228,7 @@ void LLFirstUse::useSandbox()
 		LLSD args;
 		args["HOURS"] = llformat("%d",SANDBOX_CLEAN_FREQ);
 		args["TIME"] = llformat("%d",SANDBOX_FIRST_CLEAN_HOUR);
-		LLNotifications::instance().add("FirstSandbox", args);
+		LLNotificationsUtil::add("FirstSandbox", args);
 	}
 }
 
@@ -238,7 +239,7 @@ void LLFirstUse::useFlexible()
 	{
 		gWarningSettings.setBOOL("FirstFlexible", FALSE);
 
-		LLNotifications::instance().add("FirstFlexible");
+		LLNotificationsUtil::add("FirstFlexible");
 	}
 }
 
@@ -249,7 +250,7 @@ void LLFirstUse::useDebugMenus()
 	{
 		gWarningSettings.setBOOL("FirstDebugMenus", FALSE);
 
-		LLNotifications::instance().add("FirstDebugMenus");
+		LLNotificationsUtil::add("FirstDebugMenus");
 	}
 }
 
@@ -260,7 +261,7 @@ void LLFirstUse::useSculptedPrim()
 	{
 		gWarningSettings.setBOOL("FirstSculptedPrim", FALSE);
 
-		LLNotifications::instance().add("FirstSculptedPrim");
+		LLNotificationsUtil::add("FirstSculptedPrim");
 		
 	}
 }
@@ -274,6 +275,6 @@ void LLFirstUse::useMedia()
 
 		// Popup removed as a short-term fix for EXT-1643.
 		// Ultimately, the plan is to kill all First Use dialogs
-		//LLNotifications::instance().add("FirstMedia");
+		//LLNotificationsUtil::add("FirstMedia");
 	}
 }
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 80b0a430e0248fc76f95594a80df1bd14b167288..58c0c197618d4afc3c2bb11ec120344cfb659fc6 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -269,10 +269,10 @@ 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";
+	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
 
 	// TODO: Implement media plugin version query
-	info["QT_WEBKIT_VERSION"] = "4.5.2";
+	info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)";
 
 	if (gPacketsIn > 0)
 	{
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 095fe0a220faa97437f3b0269994828f737b64ad..eae2747cc93a5cb736285b7e7d4b90a808525b63 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -38,6 +38,7 @@
 #include "lldatapacker.h"
 #include "lldir.h"
 #include "lleconomy.h"
+#include "llnotificationsutil.h"
 #include "llvfile.h"
 #include "llapr.h"
 #include "llstring.h"
@@ -998,7 +999,7 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata)
 			else
 			{
 				llwarns << "Failure writing animation data." << llendl;
-				LLNotifications::instance().add("WriteAnimationFail");
+				LLNotificationsUtil::add("WriteAnimationFail");
 			}
 		}
 
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 9ba61ba92f7e1e0cc8943b51191ed8ca4289f546..b63bcccf6bf2ac07f7ad67b8c2a05ab8b5237617 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -46,6 +46,8 @@
 
 #include "llagent.h"
 #include "llcombobox.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llsavedsettingsglue.h"
 #include "llviewertexturelist.h"
@@ -251,7 +253,7 @@ void LLFloaterAuction::onClickStartAuction(void* data)
 								   FALSE);
 		self->getWindow()->incBusyCount();
 
-		LLNotifications::instance().add("UploadingAuctionSnapshot");
+		LLNotificationsUtil::add("UploadingAuctionSnapshot");
 
 	}
 	LLMessageSystem* msg = gMessageSystem;
@@ -478,7 +480,7 @@ void LLFloaterAuction::onClickSellToAnyone(void* data)
 // Sell confirmation clicked
 bool LLFloaterAuction::onSellToAnyoneConfirmed(const LLSD& notification, const LLSD& response)	
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		doSellToAnyone();
@@ -543,13 +545,13 @@ void auction_tga_upload_done(const LLUUID& asset_id, void* user_data, S32 status
 
 	if (0 == status)
 	{
-		LLNotifications::instance().add("UploadWebSnapshotDone");
+		LLNotificationsUtil::add("UploadWebSnapshotDone");
 	}
 	else
 	{
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("UploadAuctionSnapshotFail", args);
+		LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
 	}
 }
 
@@ -564,12 +566,12 @@ void auction_j2c_upload_done(const LLUUID& asset_id, void* user_data, S32 status
 
 	if (0 == status)
 	{
-		LLNotifications::instance().add("UploadSnapshotDone");
+		LLNotificationsUtil::add("UploadSnapshotDone");
 	}
 	else
 	{
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("UploadAuctionSnapshotFail", args);
+		LLNotificationsUtil::add("UploadAuctionSnapshotFail", args);
 	}
 }
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index c8df6c6135862256d8f5b0d7689f2cade0193cfc..16a5bb63e700cb80924667a6f7a14bc5f977a465 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -46,6 +46,7 @@
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for get_item_icon
 #include "llinventoryfunctions.h"
+#include "llnotificationsutil.h"
 #include "llselectmgr.h"
 #include "llscrolllistctrl.h"
 #include "llviewerobject.h"
@@ -99,7 +100,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
 
 	if (selection->getRootObjectCount() != 1)
 	{
-		LLNotifications::instance().add("BuyOneObjectOnly");
+		LLNotificationsUtil::add("BuyOneObjectOnly");
 		return;
 	}
 	
@@ -136,7 +137,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
 	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
 	if (!owners_identical)
 	{
-		LLNotifications::instance().add("BuyObjectOneOwner");
+		LLNotificationsUtil::add("BuyObjectOneOwner");
 		return;
 	}
 
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index a99d0c918dd7d2ed59d8c78744982053519afcdc..39c7bc02af432f5cdefd27624d5d62d46527e846 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -49,6 +49,7 @@
 #include "llinventorymodel.h"	// for gInventory
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for get_item_icon
+#include "llnotificationsutil.h"
 #include "llselectmgr.h"
 #include "llscrolllistctrl.h"
 #include "llviewerobject.h"
@@ -95,7 +96,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
 
 	if (selection->getRootObjectCount() != 1)
 	{
-		LLNotifications::instance().add("BuyContentsOneOnly");
+		LLNotificationsUtil::add("BuyContentsOneOnly");
 		return;
 	}
 	
@@ -114,7 +115,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
 	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
 	if (!owners_identical)
 	{
-		LLNotifications::instance().add("BuyContentsOneOwner");
+		LLNotificationsUtil::add("BuyContentsOneOwner");
 		return;
 	}
 
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 651122f20a688afe5cdb89996c3c4db22f8a323f..1642e6725ee9c1fe2e89d8c89b9bae6226351292 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -38,6 +38,7 @@
 #include "llcurrencyuimanager.h"
 #include "llfloater.h"
 #include "llfloaterreg.h"
+#include "llnotificationsutil.h"
 #include "llstatusbar.h"
 #include "lltextbox.h"
 #include "llviewchildren.h"
@@ -152,7 +153,7 @@ void LLFloaterBuyCurrencyUI::draw()
 	{
 		if (mManager.bought())
 		{
-			LLNotifications::instance().add("BuyLindenDollarSuccess");
+			LLNotificationsUtil::add("BuyLindenDollarSuccess");
 			closeFloater();
 			return;
 		}
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 976aaf8044727b7c329d5e35925ec335afe828fa..59985a61ff20fb41bb2eec9d73889fc470a5a454 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -48,6 +48,7 @@
 #include "llframetimer.h"
 #include "lliconctrl.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llparcel.h"
 #include "llslurl.h"
@@ -215,7 +216,7 @@ void LLFloaterBuyLand::buyLand(
 {
 	if(is_for_group && !gAgent.hasPowerInActiveGroup(GP_LAND_DEED))
 	{
-		LLNotifications::instance().add("OnlyOfficerCanBuyLand");
+		LLNotificationsUtil::add("OnlyOfficerCanBuyLand");
 		return;
 	}
 
@@ -972,7 +973,7 @@ BOOL LLFloaterBuyLandUI::canClose()
 	if (!can_close)
 	{
 		// explain to user why they can't do this, see DEV-9605
-		LLNotifications::instance().add("CannotCloseFloaterBuyLand");
+		LLNotificationsUtil::add("CannotCloseFloaterBuyLand");
 	}
 	return can_close;
 }
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 92e958b32de901891afb156bce19b5d79e2d86d5..764aff68c9156b94140af6329e729a953ff3475c 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -215,17 +215,38 @@ void LLFloaterCamera::onOpen(const LLSD& key)
 		getDockTongue(), LLDockControl::TOP));
 
 	mZoom->onOpen(key);
+
+	// Returns to previous mode, see EXT-2727(View tool should remember state).
+	// In case floater was just hidden and it isn't reset the mode
+	// just update state to current one. Else go to previous.
+	if ( !mClosed )
+		updateState();
+	else
+		toPrevMode();
+	mClosed = FALSE;
 }
 
 void LLFloaterCamera::onClose(bool app_quitting)
 {
 	//We don't care of camera mode if app is quitting
-	if(!app_quitting)
-		switchMode(CAMERA_CTRL_MODE_ORBIT);
+	if(app_quitting)
+		return;
+	// When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+	// switchMode won't modify mPrevMode, so force it here.
+	// It is needed to correctly return to previous mode on open, see EXT-2727.
+	if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
+		mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+
+	// HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
+	if ( !isDocked() )
+		setDocked(true);
+	switchMode(CAMERA_CTRL_MODE_ORBIT);
+	mClosed = TRUE;
 }
 
 LLFloaterCamera::LLFloaterCamera(const LLSD& val)
 :	LLTransientDockableFloater(NULL, true, val),
+	mClosed(FALSE),
 	mCurrMode(CAMERA_CTRL_MODE_ORBIT),
 	mPrevMode(CAMERA_CTRL_MODE_ORBIT)
 {
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 4873a34e00ba9672d7407cb71d6e2defffcecf8a..5d44b4944d0ac91ea768bb4c5e9e5744144a5fbd 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -109,6 +109,7 @@ class LLFloaterCamera
 	void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
 	
 
+	BOOL mClosed;
 	ECameraControlMode mPrevMode;
 	ECameraControlMode mCurrMode;
 	std::map<ECameraControlMode, LLButton*> mMode2Button;
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index 2c66ab502d966886f6fa439e47f2551dc0259777..1482d3fe21e500601e3c53df7258269728cfd19d 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -49,6 +49,7 @@
 #include "llavataractions.h"
 #include "llinventorymodel.h"
 #include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llresmgr.h"
 #include "llscrolllistctrl.h"
@@ -535,7 +536,7 @@ void LLPanelFriends::onMaximumSelect()
 {
 	LLSD args;
 	args["MAX_SELECT"] = llformat("%d", MAX_FRIEND_SELECT);
-	LLNotifications::instance().add("MaxListSelectMessage", args);
+	LLNotificationsUtil::add("MaxListSelectMessage", args);
 };
 
 // static
@@ -639,14 +640,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
 			}
 			if (command == GRANT)
 			{
-				LLNotifications::instance().add("GrantModifyRights", 
+				LLNotificationsUtil::add("GrantModifyRights", 
 					args, 
 					LLSD(), 
 					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
 			}
 			else
 			{
-				LLNotifications::instance().add("RevokeModifyRights", 
+				LLNotificationsUtil::add("RevokeModifyRights", 
 					args, 
 					LLSD(), 
 					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
@@ -656,14 +657,14 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
 		{
 			if (command == GRANT)
 			{
-				LLNotifications::instance().add("GrantModifyRightsMultiple", 
+				LLNotificationsUtil::add("GrantModifyRightsMultiple", 
 					args, 
 					LLSD(), 
 					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
 			}
 			else
 			{
-				LLNotifications::instance().add("RevokeModifyRightsMultiple", 
+				LLNotificationsUtil::add("RevokeModifyRightsMultiple", 
 					args, 
 					LLSD(), 
 					boost::bind(&LLPanelFriends::modifyRightsConfirmation, this, _1, _2, rights));
@@ -674,7 +675,7 @@ void LLPanelFriends::confirmModifyRights(rights_map_t& ids, EGrantRevoke command
 
 bool LLPanelFriends::modifyRightsConfirmation(const LLSD& notification, const LLSD& response, rights_map_t* rights)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(0 == option)
 	{
 		sendRightsGrant(*rights);
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index d51a5d2a035038a1603335e86d09117ea16c9aeb..5072bc8c8201007f07d82f8293b2716692287b5f 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -305,7 +305,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
 		{
 			font_style = "BOLD";
 		}
-
+		item_name = gesture->mName;
 		element["columns"][0]["column"] = "trigger";
 		element["columns"][0]["value"] = gesture->mTrigger;
 		element["columns"][0]["font"]["name"] = "SANSSERIF";
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index cd3432190b7f4ea43531f7e15e817f53788a3db0..04ba11530add5ba2da00857d8cbb1681ae6ef5c1 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -39,6 +39,7 @@
 #include "llframetimer.h"
 #include "llgl.h"
 #include "llhost.h"
+#include "llnotificationsutil.h"
 #include "llregionflags.h"
 #include "llstring.h"
 #include "message.h"
@@ -847,17 +848,17 @@ void LLPanelGridTools::refresh()
 
 void LLPanelGridTools::onClickKickAll()
 {
-	LLNotifications::instance().add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
+	LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
 }
 
 
 bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)
 {
-	if (LLNotification::getSelectedOption(notification, response) == 0)
+	if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
 	{
 		LLSD payload;
 		payload["kick_message"] = response["message"].asString();
-		LLNotifications::instance().add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
+		LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
 	}
 	return false;
 }
@@ -866,7 +867,7 @@ bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& respons
 // static
 bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 
 	if (option == 0)
@@ -887,13 +888,13 @@ bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response
 
 void LLPanelGridTools::onClickFlushMapVisibilityCaches()
 {
-	LLNotifications::instance().add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
+	LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
 }
 
 // static
 bool LLPanelGridTools::flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0) return false;
 
 	// HACK: Send this as an EstateOwnerRequest so it gets routed
@@ -1101,7 +1102,7 @@ void LLPanelObjectTools::onClickDeletePublicOwnedBy()
 		payload["avatar_id"] = mTargetAvatar;
 		payload["flags"] = (S32)mSimWideDeletesFlags;
 
-		LLNotifications::instance().add( "GodDeleteAllScriptedPublicObjectsByUser",
+		LLNotificationsUtil::add( "GodDeleteAllScriptedPublicObjectsByUser",
 								args,
 								payload,
 								callbackSimWideDeletes);
@@ -1121,7 +1122,7 @@ void LLPanelObjectTools::onClickDeleteAllScriptedOwnedBy()
 		payload["avatar_id"] = mTargetAvatar;
 		payload["flags"] = (S32)mSimWideDeletesFlags;
 
-		LLNotifications::instance().add( "GodDeleteAllScriptedObjectsByUser",
+		LLNotificationsUtil::add( "GodDeleteAllScriptedObjectsByUser",
 								args,
 								payload,
 								callbackSimWideDeletes);
@@ -1141,7 +1142,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()
 		payload["avatar_id"] = mTargetAvatar;
 		payload["flags"] = (S32)mSimWideDeletesFlags;
 
-		LLNotifications::instance().add( "GodDeleteAllObjectsByUser",
+		LLNotificationsUtil::add( "GodDeleteAllObjectsByUser",
 								args,
 								payload,
 								callbackSimWideDeletes);
@@ -1151,7 +1152,7 @@ void LLPanelObjectTools::onClickDeleteAllOwnedBy()
 // static
 bool LLPanelObjectTools::callbackSimWideDeletes( const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		if (!notification["payload"]["avatar_id"].asUUID().isNull())
@@ -1334,7 +1335,7 @@ void LLPanelRequestTools::onClickRequest()
 
 void terrain_download_done(void** data, S32 status, LLExtStat ext_status)
 {
-	LLNotifications::instance().add("TerrainDownloaded");
+	LLNotificationsUtil::add("TerrainDownloaded");
 }
 
 
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index 047dc2fa920ea271e3a653e10821480476349efd..14cff3bcc3ad654aa74c639c29e7670426686240 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -40,6 +40,7 @@
 #include "llalertdialog.h"
 
 // Linden libs
+#include "llnotificationsutil.h"
 #include "lluictrlfactory.h"
 
 
@@ -56,7 +57,7 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key)
 	// do not build the floater if there the url is empty
 	if (gSavedSettings.getString("TutorialURL") == "")
 	{
-		LLNotifications::instance().add("TutorialNotFound");
+		LLNotificationsUtil::add("TutorialNotFound");
 		return;
 	}
 	
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index d855ab1dfa78fcf06d4f898f244949c24588ed0e..ed0f24d16052fce9f35a04ad0e0bb75b1072a4ab 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -39,6 +39,7 @@
 
 #include "llcachename.h"
 #include "llfocusmgr.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "message.h"
 #include "lluserauth.h"
@@ -914,7 +915,7 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
 	args["PARCEL_NAME"] = parcel_name;
 	args["TIME"] = time;
 	
-	LLNotifications::instance().add("LandBuyPass", args, LLSD(), cbBuyPass);
+	LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);
 }
 
 // static
@@ -926,7 +927,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)
 	{
 		if(parcelp->getForSale())
 		{
-			LLNotifications::instance().add("CannotStartAuctionAlreadyForSale");
+			LLNotificationsUtil::add("CannotStartAuctionAlreadyForSale");
 		}
 		else
 		{
@@ -939,7 +940,7 @@ void LLPanelLandGeneral::onClickStartAuction(void* data)
 // static
 bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		// User clicked OK
@@ -1285,7 +1286,7 @@ void send_return_objects_message(S32 parcel_local_id, S32 return_type,
 
 bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLParcel *parcel = mParcel->getParcel();
 	if (0 == option)
 	{
@@ -1295,7 +1296,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
 			LLSD args;
 			if (owner_id == gAgentID)
 			{
-				LLNotifications::instance().add("OwnedObjectsReturned");
+				LLNotificationsUtil::add("OwnedObjectsReturned");
 			}
 			else
 			{
@@ -1303,7 +1304,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
 				gCacheName->getName(owner_id, first, last);
 				args["FIRST"] = first;
 				args["LAST"] = last;
-				LLNotifications::instance().add("OtherObjectsReturned", args);
+				LLNotificationsUtil::add("OtherObjectsReturned", args);
 			}
 			send_return_objects_message(parcel->getLocalID(), RT_OWNER);
 		}
@@ -1317,7 +1318,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co
 
 bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLParcel *parcel = mParcel->getParcel();
 	if (0 == option)
 	{
@@ -1327,7 +1328,7 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co
 			gCacheName->getGroupName(parcel->getGroupID(), group_name);
 			LLSD args;
 			args["GROUPNAME"] = group_name;
-			LLNotifications::instance().add("GroupObjectsReturned", args);
+			LLNotificationsUtil::add("GroupObjectsReturned", args);
 			send_return_objects_message(parcel->getLocalID(), RT_GROUP);
 		}
 	}
@@ -1339,13 +1340,13 @@ bool LLPanelLandObjects::callbackReturnGroupObjects(const LLSD& notification, co
 
 bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLParcel *parcel = mParcel->getParcel();
 	if (0 == option)
 	{
 		if (parcel)
 		{
-			LLNotifications::instance().add("UnOwnedObjectsReturned");
+			LLNotificationsUtil::add("UnOwnedObjectsReturned");
 			send_return_objects_message(parcel->getLocalID(), RT_OTHER);
 		}
 	}
@@ -1357,7 +1358,7 @@ bool LLPanelLandObjects::callbackReturnOtherObjects(const LLSD& notification, co
 
 bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLParcel *parcel = mParcel->getParcel();
 	if (0 == option)
 	{
@@ -1371,12 +1372,12 @@ bool LLPanelLandObjects::callbackReturnOwnerList(const LLSD& notification, const
 				if (mSelectedIsGroup)
 				{
 					args["GROUPNAME"] = mSelectedName;
-					LLNotifications::instance().add("GroupObjectsReturned", args);
+					LLNotificationsUtil::add("GroupObjectsReturned", args);
 				}
 				else
 				{
 					args["NAME"] = mSelectedName;
-					LLNotifications::instance().add("OtherObjectsReturned2", args);
+					LLNotificationsUtil::add("OtherObjectsReturned2", args);
 				}
 
 				send_return_objects_message(parcel->getLocalID(), RT_LIST, &(mSelectedOwners));
@@ -1413,11 +1414,11 @@ void LLPanelLandObjects::onClickReturnOwnerList(void* userdata)
 	args["N"] = llformat("%d",self->mSelectedCount);
 	if (self->mSelectedIsGroup)
 	{
-		LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	
+		LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	
 	}
 	else 
 	{
-		LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	
+		LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerList, self, _1, _2));	
 	}
 }
 
@@ -1627,14 +1628,14 @@ void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata)
 
 	if (owner_id == gAgent.getID())
 	{
-		LLNotifications::instance().add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+		LLNotificationsUtil::add("ReturnObjectsOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
 	}
 	else
 	{
 		std::string name;
 		gCacheName->getFullName(owner_id, name);
 		args["NAME"] = name;
-		LLNotifications::instance().add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
+		LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2));
 	}
 }
 
@@ -1655,7 +1656,7 @@ void LLPanelLandObjects::onClickReturnGroupObjects(void* userdata)
 	args["N"] = llformat("%d", parcel->getGroupPrimCount());
 
 	// create and show confirmation textbox
-	LLNotifications::instance().add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));
+	LLNotificationsUtil::add("ReturnObjectsDeededToGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnGroupObjects, panelp, _1, _2));
 }
 
 // static
@@ -1680,7 +1681,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
 		gCacheName->getGroupName(parcel->getGroupID(), group_name);
 		args["NAME"] = group_name;
 
-		LLNotifications::instance().add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+		LLNotificationsUtil::add("ReturnObjectsNotOwnedByGroup", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
 	}
 	else
 	{
@@ -1688,7 +1689,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
 
 		if (owner_id == gAgent.getID())
 		{
-			LLNotifications::instance().add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+			LLNotificationsUtil::add("ReturnObjectsNotOwnedBySelf", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
 		}
 		else
 		{
@@ -1696,7 +1697,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata)
 			gCacheName->getFullName(owner_id, name);
 			args["NAME"] = name;
 
-			LLNotifications::instance().add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
+			LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2));
 		}
 	}
 }
@@ -2165,7 +2166,7 @@ void LLPanelLandOptions::onCommitAny(LLUICtrl *ctrl, void *userdata)
 	if (!allow_other_scripts && region && region->getAllowDamage())
 	{
 
-		LLNotifications::instance().add("UnableToDisableOutsideScripts");
+		LLNotificationsUtil::add("UnableToDisableOutsideScripts");
 		return;
 	}
 
@@ -2209,7 +2210,7 @@ void LLPanelLandOptions::onClickSet(void* userdata)
 
 	if (agent_parcel->getLocalID() != selected_parcel->getLocalID())
 	{
-		LLNotifications::instance().add("MustBeInParcel");
+		LLNotificationsUtil::add("MustBeInParcel");
 		return;
 	}
 
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 44e68d77455df757c92a665c13c395fc9fa465f3..f7ce826a396b1d0efb583840da927d23a5674c42 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -41,6 +41,7 @@
 #include "lluictrlfactory.h"
 #include "llbutton.h"
 #include "llselectmgr.h"
+#include "llsdutil.h"
 
 LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
 
@@ -145,15 +146,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
 //static 
 void LLFloaterMediaSettings::apply()
 {
-    LLSD settings;
+	LLSD settings;
 	sInstance->mPanelMediaSettingsGeneral->preApply();
-    sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
 	sInstance->mPanelMediaSettingsSecurity->preApply();
 	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
 	sInstance->mPanelMediaSettingsPermissions->preApply();
-    sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
 	LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
-    LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+	LLSelectMgr::getInstance()->selectionSetMediaData(settings);
 	sInstance->mPanelMediaSettingsGeneral->postApply();
 	sInstance->mPanelMediaSettingsSecurity->postApply();
 	sInstance->mPanelMediaSettingsPermissions->postApply();
@@ -183,7 +184,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab
 
 	sInstance->mPanelMediaSettingsPermissions->
 		initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
-
+	
+	// Squirrel away initial values 
+	sInstance->mInitialValues.clear();
+	sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+	sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+	sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -206,7 +212,7 @@ void LLFloaterMediaSettings::clearValues( bool editable)
 {
 	// clean up all panels before updating
 	sInstance->mPanelMediaSettingsGeneral	 ->clearValues(sInstance->mPanelMediaSettingsGeneral,  editable);
-	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,  editable);
+	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,	editable);
 	sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions,  editable);	
 }
 
@@ -235,7 +241,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
 // static
 void LLFloaterMediaSettings::onBtnCancel( void* userdata )
 {
- 	sInstance->closeFloater(); 
+	sInstance->closeFloater(); 
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -250,7 +256,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
 //
 void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
 {
-	setCtrlsEnabled( enable );
 	childSetEnabled( "OK", enable );
 	childSetEnabled( "Apply", enable );
 }
@@ -265,7 +270,6 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
 		return std::string( "" );
 }
 
-
 ////////////////////////////////////////////////////////////////////////////////
 //
 bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
@@ -279,3 +283,36 @@ bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
 		// this is all we can do
 		return false;
 }
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual 
+void LLFloaterMediaSettings::draw()
+{
+	// *NOTE: The code below is very inefficient.  Better to do this
+	// only when data change.
+	// Every frame, check to see what the values are.  If they are not
+	// the same as the default media data, enable the OK/Apply buttons
+	LLSD settings;
+	sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+	sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+	sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+
+	bool values_changed = false;
+	
+	LLSD::map_const_iterator iter = settings.beginMap();
+	LLSD::map_const_iterator end = settings.endMap();
+	for ( ; iter != end; ++iter )
+	{
+		const std::string &current_key = iter->first;
+		const LLSD &current_value = iter->second;
+		if ( ! llsd_equals(current_value, mInitialValues[current_key]))
+		{
+			values_changed = true;
+			break;
+		}
+	}
+	
+	enableOkApplyBtns(values_changed);
+	
+	LLFloater::draw();
+}
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 17a47cb0f5a4b04cd3846574261f251a9855fac8..e2af1705bf7de7223c6370f2360a28f448192b48 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -54,11 +54,13 @@ class LLFloaterMediaSettings :
 	static void apply();
 	static void initValues( const LLSD& media_settings , bool editable);
 	static void clearValues( bool editable);
-	void enableOkApplyBtns( bool enable );
-	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
-	const std::string getHomeUrl();
+
+	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};	
+	const std::string getHomeUrl();	
 	bool passesWhiteList( const std::string& test_url );
 
+	virtual void	draw();
+
 	bool mIdenticalHasMediaInfo;
 	bool mMultipleMedia;
 	bool mMultipleValidMedia;
@@ -83,6 +85,10 @@ class LLFloaterMediaSettings :
 	static LLFloaterMediaSettings* sInstance;
 
 private:
+
+	void enableOkApplyBtns( bool enable );
+	
+	LLSD mInitialValues;
 	bool mWaitingToClose;
 };
 
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index f20fca1258b8945b41957ce8605ff5666293540b..90db8988b2015877c661c5a4324cbcf1dac75a22 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -233,7 +233,7 @@ void LLFloaterNotificationConsole::onClickAdd()
 	std::string message_name = getChild<LLComboBox>("notification_types")->getValue().asString();
 	if (!message_name.empty())
 	{
-		LLNotifications::instance().add(message_name, LLSD());
+		LLNotifications::instance().add(message_name, LLSD(), LLSD());
 	}
 }
 
diff --git a/indra/newview/llfloaternotificationsconsole.h b/indra/newview/llfloaternotificationsconsole.h
index 7349ff1d8f1f6f47cb7bc35baf60e5e12d3e8001..a05d559eb4e149b723a5c9b1378211a8d4f60ff6 100644
--- a/indra/newview/llfloaternotificationsconsole.h
+++ b/indra/newview/llfloaternotificationsconsole.h
@@ -35,7 +35,9 @@
 
 #include "llfloater.h"
 #include "lllayoutstack.h"
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
+
+class LLNotification;
 
 class LLFloaterNotificationConsole : 
 	public LLFloater
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index e277aba493c67fc2739e00fd0671cca4dfba7eb9..6caa0d60f964182e3b317b3d27f113fdbef7a97f 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -41,6 +41,7 @@
 
 #include "llcachename.h"
 #include "llbutton.h"
+#include "llnotificationsutil.h"
 #include "lltextbox.h"
 
 #include "llalertdialog.h"
@@ -84,7 +85,7 @@ void LLFloaterOpenObject::onOpen(const LLSD& key)
 	LLObjectSelectionHandle object_selection = LLSelectMgr::getInstance()->getSelection();
 	if (object_selection->getRootObjectCount() != 1)
 	{
-		LLNotifications::instance().add("UnableToViewContentsMoreThanOne");
+		LLNotificationsUtil::add("UnableToViewContentsMoreThanOne");
 		closeFloater();
 		return;
 	}
@@ -141,7 +142,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
 {
 	if (mObjectSelection->getRootObjectCount() != 1)
 	{
-		LLNotifications::instance().add("OnlyCopyContentsOfSingleItem");
+		LLNotificationsUtil::add("OnlyCopyContentsOfSingleItem");
 		return;
 	}
 
@@ -182,7 +183,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear)
 		delete data;
 		data = NULL;
 
-		LLNotifications::instance().add("OpenObjectCannotCopy");
+		LLNotificationsUtil::add("OpenObjectCannotCopy");
 	}
 }
 
diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp
index ae1a99e5fc4a0db35491176f49cac7bf3590d3a5..572eeb57fee969ef394b325a26a474f087470fab 100644
--- a/indra/newview/llfloaterpostcard.cpp
+++ b/indra/newview/llfloaterpostcard.cpp
@@ -46,6 +46,7 @@
 #include "llbutton.h"
 #include "lltexteditor.h"
 #include "llfloaterreg.h"
+#include "llnotificationsutil.h"
 #include "llviewercontrol.h"
 #include "llviewernetwork.h"
 #include "lluictrlfactory.h"
@@ -222,20 +223,20 @@ void LLFloaterPostcard::onClickSend(void* data)
 		
 		if (to.empty() || !boost::regex_match(to, emailFormat))
 		{
-			LLNotifications::instance().add("PromptRecipientEmail");
+			LLNotificationsUtil::add("PromptRecipientEmail");
 			return;
 		}
 
 		if (from.empty() || !boost::regex_match(from, emailFormat))
 		{
-			LLNotifications::instance().add("PromptSelfEmail");
+			LLNotificationsUtil::add("PromptSelfEmail");
 			return;
 		}
 
 		std::string subject(self->childGetValue("subject_form").asString());
 		if(subject.empty() || !self->mHasFirstMsgFocus)
 		{
-			LLNotifications::instance().add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
+			LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2));
 			return;
 		}
 
@@ -245,7 +246,7 @@ void LLFloaterPostcard::onClickSend(void* data)
 		}
 		else
 		{
-			LLNotifications::instance().add("ErrorProcessingSnapshot");
+			LLNotificationsUtil::add("ErrorProcessingSnapshot");
 		}
 	}
 }
@@ -261,7 +262,7 @@ void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data,
 	{
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
-		LLNotifications::instance().add("ErrorUploadingPostcard", args);
+		LLNotificationsUtil::add("ErrorUploadingPostcard", args);
 	}
 	else
 	{
@@ -321,7 +322,7 @@ void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, voi
 
 bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(0 == option)
 	{
 		// User clicked OK
diff --git a/indra/newview/llfloaterpostprocess.cpp b/indra/newview/llfloaterpostprocess.cpp
index 2ab54d6e46d3402657a21f639ce3c46d6330de5c..87a12d3d66c5726333a7810b51568c7bde5e0f48 100644
--- a/indra/newview/llfloaterpostprocess.cpp
+++ b/indra/newview/llfloaterpostprocess.cpp
@@ -36,7 +36,7 @@
 
 #include "llsliderctrl.h"
 #include "llcheckboxctrl.h"
-#include "llcombobox.h"
+#include "llnotificationsutil.h"
 #include "lluictrlfactory.h"
 #include "llviewerdisplay.h"
 #include "llpostprocess.h"
@@ -161,7 +161,7 @@ void LLFloaterPostProcess::onSaveEffect(LLLineEditor* editBox)
 	{
 		LLSD payload;
 		payload["effect_name"] = effectName;
-		LLNotifications::instance().add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2));
+		LLNotificationsUtil::add("PPSaveEffectAlert", LLSD(), payload, boost::bind(&LLFloaterPostProcess::saveAlertCallback, this, _1, _2));
 	}
 	else
 	{
@@ -181,7 +181,7 @@ void LLFloaterPostProcess::onChangeEffectName(LLUICtrl* ctrl)
 
 bool LLFloaterPostProcess::saveAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	// if they choose save, do it.  Otherwise, don't do anything
 	if (option == 0)
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index e20249a737a2abe034af34e42dffd655c497c233..83c784c1f7898843991e78196e415d04b23f2d51 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -60,6 +60,8 @@
 #include "llkeyboard.h"
 #include "llmodaldialog.h"
 #include "llnavigationbar.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llpanellogin.h"
 #include "llradiogroup.h"
 #include "llsearchcombobox.h"
@@ -203,7 +205,7 @@ viewer_media_t get_web_media()
 
 bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if ( option == 0 ) // YES
 	{
 		// clean web
@@ -216,7 +218,7 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response
 		
 		// flag client texture cache for clearing next time the client runs
 		gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
-		LLNotifications::instance().add("CacheWillClear");
+		LLNotificationsUtil::add("CacheWillClear");
 
 		LLSearchHistory::getInstance()->clearHistory();
 		LLSearchHistory::getInstance()->save();
@@ -241,7 +243,7 @@ void handleNameTagOptionChanged(const LLSD& newvalue)
 
 bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option && floater )
 	{
 		if ( floater )
@@ -256,7 +258,7 @@ bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFlo
 
 bool callback_reset_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if ( 0 == option && floater )
 	{
 		if ( floater )
@@ -412,7 +414,7 @@ void LLFloaterPreference::apply()
 	LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
 	if (sSkin != gSavedSettings.getString("SkinCurrent"))
 	{
-		LLNotifications::instance().add("ChangeSkin");
+		LLNotificationsUtil::add("ChangeSkin");
 		refreshSkin(this);
 	}
 	// Call apply() on all panels that derive from LLPanelPreference
@@ -713,13 +715,13 @@ void LLFloaterPreference::onClickClearCache()
 {
 	// flag client cache for clearing next time the client runs
 	gSavedSettings.setBOOL("PurgeCacheOnNextStartup", TRUE);
-	LLNotifications::instance().add("CacheWillClear");
+	LLNotificationsUtil::add("CacheWillClear");
 }
 */
 
 void LLFloaterPreference::onClickBrowserClearCache()
 {
-	LLNotifications::instance().add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
+	LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
 }
 
 void LLFloaterPreference::onClickSetCache()
@@ -739,7 +741,7 @@ void LLFloaterPreference::onClickSetCache()
 	if (!dir_name.empty() && dir_name != cur_name)
 	{
 		std::string new_top_folder(gDirUtilp->getBaseFileName(dir_name));	
-		LLNotifications::instance().add("CacheWillBeMoved");
+		LLNotificationsUtil::add("CacheWillBeMoved");
 		gSavedSettings.setString("NewCacheLocation", dir_name);
 		gSavedSettings.setString("NewCacheLocationTopFolder", new_top_folder);
 	}
@@ -758,7 +760,7 @@ void LLFloaterPreference::onClickResetCache()
 	{
 		gSavedSettings.setString("NewCacheLocation", "");
 		gSavedSettings.setString("NewCacheLocationTopFolder", "");
-		LLNotifications::instance().add("CacheWillBeMoved");
+		LLNotificationsUtil::add("CacheWillBeMoved");
 	}
 	std::string cache_location = gDirUtilp->getCacheDir(true);
 	gSavedSettings.setString("CacheLocation", cache_location);
@@ -1080,12 +1082,12 @@ void LLFloaterPreference::onClickSetMiddleMouse()
 
 void LLFloaterPreference::onClickSkipDialogs()
 {
-	LLNotifications::instance().add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));
+	LLNotificationsUtil::add("SkipShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_skip_dialogs, _1, _2, this));
 }
 
 void LLFloaterPreference::onClickResetDialogs()
 {
-	LLNotifications::instance().add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));
+	LLNotificationsUtil::add("ResetShowNextTimeDialogs", LLSD(), LLSD(), boost::bind(&callback_reset_dialogs, _1, _2, this));
 }
 
 void LLFloaterPreference::onClickEnablePopup()
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 32229bd85045a5d58a099764c03be62ef5bb0427..05a46ad89451e4b40a34d1acffe2f0bbeb048fe5 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -64,6 +64,8 @@
 #include "lllineeditor.h"
 #include "llalertdialog.h"
 #include "llnamelistctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistitem.h"
 #include "llsliderctrl.h"
 #include "llslurl.h"
@@ -635,7 +637,7 @@ void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& name
 void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
 {
 	llinfos << "LLPanelRegionGeneralInfo::onClickKickAll" << llendl;
-	LLNotifications::instance().add("KickUsersFromRegion", 
+	LLNotificationsUtil::add("KickUsersFromRegion", 
 									LLSD(), 
 									LLSD(), 
 									boost::bind(&LLPanelRegionGeneralInfo::onKickAllCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
@@ -643,7 +645,7 @@ void LLPanelRegionGeneralInfo::onClickKickAll(void* userdata)
 
 bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		strings_t strings;
@@ -663,7 +665,7 @@ bool LLPanelRegionGeneralInfo::onKickAllCommit(const LLSD& notification, const L
 void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
 {
 	llinfos << "LLPanelRegionGeneralInfo::onClickMessage" << llendl;
-	LLNotifications::instance().add("MessageRegion", 
+	LLNotificationsUtil::add("MessageRegion", 
 		LLSD(), 
 		LLSD(), 
 		boost::bind(&LLPanelRegionGeneralInfo::onMessageCommit, (LLPanelRegionGeneralInfo*)userdata, _1, _2));
@@ -672,7 +674,7 @@ void LLPanelRegionGeneralInfo::onClickMessage(void* userdata)
 // static
 bool LLPanelRegionGeneralInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
 {
-	if(LLNotification::getSelectedOption(notification, response) != 0) return false;
+	if(LLNotificationsUtil::getSelectedOption(notification, response) != 0) return false;
 
 	std::string text = response["message"].asString();
 	if (text.empty()) return false;
@@ -775,7 +777,7 @@ BOOL LLPanelRegionGeneralInfo::sendUpdate()
 	LLViewerRegion* region = gAgent.getRegion();
 	if (region && (childGetValue("access_combo").asInteger() != region->getSimAccess()) )
 	{
-		LLNotifications::instance().add("RegionMaturityChange");
+		LLNotificationsUtil::add("RegionMaturityChange");
 	}	
 
 	return TRUE;
@@ -882,13 +884,13 @@ void LLPanelRegionDebugInfo::onClickReturn(void* data)
 	}
 	payload["flags"] = int(flags);
 	payload["return_estate_wide"] = panelp->childGetValue("return_estate_wide").asBoolean();
-	LLNotifications::instance().add("EstateObjectReturn", args, payload, 
+	LLNotificationsUtil::add("EstateObjectReturn", args, payload, 
 									boost::bind(&LLPanelRegionDebugInfo::callbackReturn, panelp, _1, _2));
 }
 
 bool LLPanelRegionDebugInfo::callbackReturn(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0) return false;
 
 	LLUUID target_avatar = notification["payload"]["avatar_id"].asUUID();
@@ -948,13 +950,13 @@ void LLPanelRegionDebugInfo::onClickTopScripts(void* data)
 // static
 void LLPanelRegionDebugInfo::onClickRestart(void* data)
 {
-	LLNotifications::instance().add("ConfirmRestart", LLSD(), LLSD(), 
+	LLNotificationsUtil::add("ConfirmRestart", LLSD(), LLSD(), 
 		boost::bind(&LLPanelRegionDebugInfo::callbackRestart, (LLPanelRegionDebugInfo*)data, _1, _2));
 }
 
 bool LLPanelRegionDebugInfo::callbackRestart(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0) return false;
 
 	strings_t strings;
@@ -1122,7 +1124,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
 			LLSD args;
 			args["TEXTURE_NUM"] = i+1;
 			args["TEXTURE_BIT_DEPTH"] = llformat("%d",components * 8);
-			LLNotifications::instance().add("InvalidTerrainBitDepth", args);
+			LLNotificationsUtil::add("InvalidTerrainBitDepth", args);
 			return FALSE;
 		}
 
@@ -1133,7 +1135,7 @@ BOOL LLPanelRegionTextureInfo::validateTextureSizes()
 			args["TEXTURE_NUM"] = i+1;
 			args["TEXTURE_SIZE_X"] = width;
 			args["TEXTURE_SIZE_Y"] = height;
-			LLNotifications::instance().add("InvalidTerrainSize", args);
+			LLNotificationsUtil::add("InvalidTerrainSize", args);
 			return FALSE;
 			
 		}
@@ -1311,21 +1313,18 @@ void LLPanelRegionTerrainInfo::onClickUploadRaw(void* data)
 	LLUUID invoice(LLFloaterRegionInfo::getLastInvoice());
 	self->sendEstateOwnerMessage(gMessageSystem, "terrain", invoice, strings);
 
-	LLNotifications::instance().add("RawUploadStarted");
+	LLNotificationsUtil::add("RawUploadStarted");
 }
 
 // static
 void LLPanelRegionTerrainInfo::onClickBakeTerrain(void* data)
 {
-	LLNotification::Params::Functor functor_params;
-	functor_params.function(boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));
-
-	LLNotifications::instance().add(LLNotification::Params("ConfirmBakeTerrain").functor(functor_params));
+	LLNotificationsUtil::add("ConfirmBakeTerrain", LLSD(), LLSD(), boost::bind(&LLPanelRegionTerrainInfo::callbackBakeTerrain, (LLPanelRegionTerrainInfo*)data, _1, _2));
 }
 
 bool LLPanelRegionTerrainInfo::callbackBakeTerrain(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0) return false;
 
 	strings_t strings;
@@ -1412,7 +1411,7 @@ void LLPanelEstateInfo::onClickAddAllowedAgent(void* user_data)
 
 		LLSD args;
 		args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
-		LLNotifications::instance().add("MaxAllowedAgentOnRegion", args);
+		LLNotificationsUtil::add("MaxAllowedAgentOnRegion", args);
 		return;
 	}
 	accessAddCore(ESTATE_ACCESS_ALLOWED_AGENT_ADD, "EstateAllowedAgentAdd");
@@ -1432,7 +1431,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()
 	{
 		LLSD args;
 		args["MAX_GROUPS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
-		LLNotifications::instance().add("MaxAllowedGroupsOnRegion", args);
+		LLNotificationsUtil::add("MaxAllowedGroupsOnRegion", args);
 		return;
 	}
 
@@ -1450,7 +1449,7 @@ void LLPanelEstateInfo::onClickAddAllowedGroup()
 
 bool LLPanelEstateInfo::addAllowedGroup(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0) return false;
 
 	LLFloater* parent_floater = gFloaterView->getParentFloater(this);
@@ -1487,7 +1486,7 @@ void LLPanelEstateInfo::onClickAddBannedAgent(void* user_data)
 	{
 		LLSD args;
 		args["MAX_BANNED"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
-		LLNotifications::instance().add("MaxBannedAgentsOnRegion", args);
+		LLNotificationsUtil::add("MaxBannedAgentsOnRegion", args);
 		return;
 	}
 	accessAddCore(ESTATE_ACCESS_BANNED_AGENT_ADD, "EstateBannedAgentAdd");
@@ -1509,7 +1508,7 @@ void LLPanelEstateInfo::onClickAddEstateManager(void* user_data)
 	{	// Tell user they can't add more managers
 		LLSD args;
 		args["MAX_MANAGER"] = llformat("%d",ESTATE_MAX_MANAGERS);
-		LLNotifications::instance().add("MaxManagersOnRegion", args);
+		LLNotificationsUtil::add("MaxManagersOnRegion", args);
 	}
 	else
 	{	// Go pick managers to add
@@ -1567,13 +1566,13 @@ void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names,
 	args["EVIL_USER"] = names[0];
 	LLSD payload;
 	payload["agent_id"] = ids[0];
-	LLNotifications::instance().add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, self, _1, _2));
+	LLNotificationsUtil::add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, self, _1, _2));
 
 }
 
 bool LLPanelEstateInfo::kickUserConfirm(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:
@@ -1722,7 +1721,7 @@ void LLPanelEstateInfo::accessAddCore(U32 operation_flag, const std::string& dia
 // static
 bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0)
 	{
 		// abort change
@@ -1766,7 +1765,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co
 			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
 			args["LIST_TYPE"] = "Allowed Residents";
 			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
-			LLNotifications::instance().add("MaxAgentOnRegionBatch", args);
+			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
 			delete change_info;
 			return;
 		}
@@ -1782,7 +1781,7 @@ void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, co
 			args["MAX_AGENTS"] = llformat("%d",ESTATE_MAX_ACCESS_IDS);
 			args["LIST_TYPE"] = "Banned Residents";
 			args["NUM_EXCESS"] = llformat("%d",(ids.size()+currentCount)-ESTATE_MAX_ACCESS_IDS);
-			LLNotifications::instance().add("MaxAgentOnRegionBatch", args);
+			LLNotificationsUtil::add("MaxAgentOnRegionBatch", args);
 			delete change_info;
 			return;
 		}
@@ -1851,7 +1850,7 @@ void LLPanelEstateInfo::accessRemoveCore(U32 operation_flag, const std::string&
 // static
 bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0)
 	{
 		// abort
@@ -1868,7 +1867,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&
 	{
 		LLSD args;
 		args["ALL_ESTATES"] = all_estates_text();
-		LLNotifications::instance().add(notification["payload"]["dialog_name"], 
+		LLNotificationsUtil::add(notification["payload"]["dialog_name"], 
 										args,
 										notification["payload"],
 										accessCoreConfirm);
@@ -1881,7 +1880,7 @@ bool LLPanelEstateInfo::accessRemoveCore2(const LLSD& notification, const LLSD&
 // static
 bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	const U32 originalFlags = (U32)notification["payload"]["operation"].asInteger();
 
 	LLViewerRegion* region = gAgent.getRegion();
@@ -1900,7 +1899,7 @@ bool LLPanelEstateInfo::accessCoreConfirm(const LLSD& notification, const LLSD&
 		if (((U32)notification["payload"]["operation"].asInteger() & ESTATE_ACCESS_BANNED_AGENT_ADD)
 		    && region && (region->getOwner() == id))
 		{
-			LLNotifications::instance().add("OwnerCanNotBeDenied");
+			LLNotificationsUtil::add("OwnerCanNotBeDenied");
 			break;
 		}
 		switch(option)
@@ -2162,7 +2161,7 @@ BOOL LLPanelEstateInfo::sendUpdate()
 
 bool LLPanelEstateInfo::callbackChangeLindenEstate(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:
@@ -2551,12 +2550,12 @@ BOOL LLPanelEstateInfo::checkSunHourSlider(LLUICtrl* child_ctrl)
 void LLPanelEstateInfo::onClickMessageEstate(void* userdata)
 {
 	llinfos << "LLPanelEstateInfo::onClickMessageEstate" << llendl;
-	LLNotifications::instance().add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));
+	LLNotificationsUtil::add("MessageEstate", LLSD(), LLSD(), boost::bind(&LLPanelEstateInfo::onMessageCommit, (LLPanelEstateInfo*)userdata, _1, _2));
 }
 
 bool LLPanelEstateInfo::onMessageCommit(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	std::string text = response["message"].asString();
 	if(option != 0) return false;
 	if(text.empty()) return false;
@@ -2685,7 +2684,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop
 		{
 			LLSD payload;
 			payload["item_id"] = item->getUUID();
-			LLNotifications::instance().add("EstateChangeCovenant", LLSD(), payload,
+			LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), payload,
 									LLPanelEstateCovenant::confirmChangeCovenantCallback);
 		}
 		break;
@@ -2700,7 +2699,7 @@ BOOL LLPanelEstateCovenant::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop
 // static 
 bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLInventoryItem* item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
 	LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
 
@@ -2720,7 +2719,7 @@ bool LLPanelEstateCovenant::confirmChangeCovenantCallback(const LLSD& notificati
 // static
 void LLPanelEstateCovenant::resetCovenantID(void* userdata)
 {
-	LLNotifications::instance().add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);
+	LLNotificationsUtil::add("EstateChangeCovenant", LLSD(), LLSD(), confirmResetCovenantCallback);
 }
 
 // static
@@ -2729,7 +2728,7 @@ bool LLPanelEstateCovenant::confirmResetCovenantCallback(const LLSD& notificatio
 	LLPanelEstateCovenant* self = LLFloaterRegionInfo::getPanelCovenant();
 	if (!self) return false;
 
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:		
@@ -2793,7 +2792,7 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
 				if( !panelp->mEditor->importBuffer( &buffer[0], file_length+1 ) )
 				{
 					llwarns << "Problem importing estate covenant." << llendl;
-					LLNotifications::instance().add("ProblemImportingEstateCovenant");
+					LLNotificationsUtil::add("ProblemImportingEstateCovenant");
 				}
 				else
 				{
@@ -2813,15 +2812,15 @@ void LLPanelEstateCovenant::onLoadComplete(LLVFS *vfs,
 			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
 				LL_ERR_FILE_EMPTY == status)
 			{
-				LLNotifications::instance().add("MissingNotecardAssetID");
+				LLNotificationsUtil::add("MissingNotecardAssetID");
 			}
 			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
 			{
-				LLNotifications::instance().add("NotAllowedToViewNotecard");
+				LLNotificationsUtil::add("NotAllowedToViewNotecard");
 			}
 			else
 			{
-				LLNotifications::instance().add("UnableToLoadNotecardAsset");
+				LLNotificationsUtil::add("UnableToLoadNotecardAsset");
 			}
 
 			llwarns << "Problem loading notecard: " << status << llendl;
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 1002697fe56f32667a50842194038e133c58c7c1..1f3bd50d5b6ed04bd651f881980dccbf2ca312eb 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -42,6 +42,7 @@
 #include "llfontgl.h"
 #include "llgl.h"			// for renderer
 #include "llinventory.h"
+#include "llnotificationsutil.h"
 #include "llstring.h"
 #include "llsys.h"
 #include "llversionviewer.h"
@@ -123,11 +124,11 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
 
 		if ( email_to_estate_owner )
 		{
-			LLNotifications::instance().add("HelpReportAbuseEmailEO");
+			LLNotificationsUtil::add("HelpReportAbuseEmailEO");
 		}
 		else
 		{
-			LLNotifications::instance().add("HelpReportAbuseEmailLL");
+			LLNotificationsUtil::add("HelpReportAbuseEmailLL");
 		}
 	};
 }
@@ -379,7 +380,7 @@ void LLFloaterReporter::onClickSend(void *userdata)
 					category_value == IP_CONTENT_REMOVAL ||
 					category_value == IP_PERMISSONS_EXPLOIT)
 				{
-					LLNotifications::instance().add("HelpReportAbuseContainsCopyright");
+					LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
 					self->mCopyrightWarningSeen = TRUE;
 					return;
 				}
@@ -388,7 +389,7 @@ void LLFloaterReporter::onClickSend(void *userdata)
 			{
 				// IP_CONTENT_REMOVAL *always* shows the dialog - 
 				// ergo you can never send that abuse report type.
-				LLNotifications::instance().add("HelpReportAbuseContainsCopyright");
+				LLNotificationsUtil::add("HelpReportAbuseContainsCopyright");
 				return;
 			}
 
@@ -524,39 +525,39 @@ bool LLFloaterReporter::validateReport()
 	U8 category = (U8)category_sd.asInteger();
 	if (category == 0)
 	{
-		LLNotifications::instance().add("HelpReportAbuseSelectCategory");
+		LLNotificationsUtil::add("HelpReportAbuseSelectCategory");
 		return false;
 	}
 
 
 	if ( childGetText("abuser_name_edit").empty() )
 	{
-		LLNotifications::instance().add("HelpReportAbuseAbuserNameEmpty");
+		LLNotificationsUtil::add("HelpReportAbuseAbuserNameEmpty");
 		return false;
 	};
 
 	if ( childGetText("abuse_location_edit").empty() )
 	{
-		LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty");
+		LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
 		return false;
 	};
 
 	if ( childGetText("abuse_location_edit").empty() )
 	{
-		LLNotifications::instance().add("HelpReportAbuseAbuserLocationEmpty");
+		LLNotificationsUtil::add("HelpReportAbuseAbuserLocationEmpty");
 		return false;
 	};
 
 
 	if ( childGetText("summary_edit").empty() )
 	{
-		LLNotifications::instance().add("HelpReportAbuseSummaryEmpty");
+		LLNotificationsUtil::add("HelpReportAbuseSummaryEmpty");
 		return false;
 	};
 
 	if ( childGetText("details_edit") == mDefaultSummary )
 	{
-		LLNotifications::instance().add("HelpReportAbuseDetailsEmpty");
+		LLNotificationsUtil::add("HelpReportAbuseDetailsEmpty");
 		return false;
 	};
 	return true;
@@ -829,7 +830,7 @@ void LLFloaterReporter::uploadDoneCallback(const LLUUID &uuid, void *user_data,
 	{
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
-		LLNotifications::instance().add("ErrorUploadingReportScreenshot", args);
+		LLNotificationsUtil::add("ErrorUploadingReportScreenshot", args);
 
 		std::string err_msg("There was a problem uploading a report screenshot");
 		err_msg += " due to the following reason: " + args["REASON"].asString();
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index e2df2ffdf700a790ca203e626c03dbb72be1893f..c8ff36b4f46eb966d9e74ee22f852d09846caa76 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -37,6 +37,7 @@
 #include "lllogininstance.h"
 #include "lluri.h"
 #include "llagent.h"
+#include "llui.h"
 
 LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
 	LLFloater(key),
@@ -139,6 +140,9 @@ void LLFloaterSearch::search(const LLSD &key)
 	}
 	url += "&r=" + maturity;
 
+	// add the current localization information
+	url += "&lang=" + LLUI::getLanguage();
+
 	// and load the URL in the web view
 	mBrowser->navigateTo(url);
 }
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index 2d8ccd1aef743a4e8f18d5382b660922310fabe8..49e8f9c95678b2637eda063d5fa20a5e7ea660cd 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -37,6 +37,8 @@
 #include "llfloaterreg.h"
 #include "llfloaterland.h"
 #include "lllineeditor.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llparcel.h"
 #include "llselectmgr.h"
@@ -425,7 +427,7 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata)
 
 	send_parcel_select_objects(parcel->getLocalID(), RT_SELL);
 
-	LLNotifications::instance().add("TransferObjectsHighlighted",
+	LLNotificationsUtil::add("TransferObjectsHighlighted",
 						LLSD(), LLSD(),
 						&LLFloaterSellLandUI::callbackHighlightTransferable);
 }
@@ -460,7 +462,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
 		&& (sale_price == 0) 
 		&& sell_to_anyone)
 	{
-		LLNotifications::instance().add("SalePriceRestriction");
+		LLNotificationsUtil::add("SalePriceRestriction");
 		return;
 	}
 
@@ -493,7 +495,7 @@ void LLFloaterSellLandUI::doSellLand(void *userdata)
 
 bool LLFloaterSellLandUI::onConfirmSale(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option != 0)
 	{
 		return false;
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index 1cc7042c3a0bb60c645623c5b784efb9113ad459..dbecd45d1f2cf591e8cc615f920d9a18e7f576ff 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -76,6 +76,7 @@
 #include "llimagebmp.h"
 #include "llimagej2c.h"
 #include "lllocalcliprect.h"
+#include "llnotificationsutil.h"
 #include "llresmgr.h"		// LLLocale
 #include "llvfile.h"
 #include "llvfs.h"
@@ -993,7 +994,7 @@ void LLSnapshotLivePreview::saveTexture()
 	}
 	else
 	{
-		LLNotifications::instance().add("ErrorEncodingSnapshot");
+		LLNotificationsUtil::add("ErrorEncodingSnapshot");
 		llwarns << "Error encoding snapshot" << llendl;
 	}
 
diff --git a/indra/newview/llfloatertestlistview.cpp b/indra/newview/llfloatertestlistview.cpp
index 5c942d0ed9ee3ffaa2bd95f0ff107ea5447bc8ec..7171449738b423c3712b61438465a46d23c2ce9c 100644
--- a/indra/newview/llfloatertestlistview.cpp
+++ b/indra/newview/llfloatertestlistview.cpp
@@ -33,45 +33,9 @@
 
 #include "llfloatertestlistview.h"
 
-// Viewer includes
-#include "lllistview.h"
-
-// Linden library includes
-//#include "lluictrlfactory.h"
-
 LLFloaterTestListView::LLFloaterTestListView(const LLSD& seed)
-:	LLFloater(seed),
-	mListView(NULL)
-{
-	// set up named callback functions for test buttons
-	mCommitCallbackRegistrar.add("TestListView.Test1",
-		boost::bind(&LLFloaterTestListView::onClickTest1, this));
-	mCommitCallbackRegistrar.add("TestListView.Test2",
-		boost::bind(&LLFloaterTestListView::onClickTest2, this));
-}
+:	LLFloater(seed)
+{}
 
 LLFloaterTestListView::~LLFloaterTestListView()
 {}
-
-BOOL LLFloaterTestListView::postBuild()
-{
-	mListView = getChild<LLListView>("test_list_view");
-	// just set a random property
-	mListView->setString("set programmatically");
-	return LLFloater::postBuild();
-}
-
-void LLFloaterTestListView::onListViewChanged()
-{
-	llinfos << "list view changed" << llendl;
-}
-
-void LLFloaterTestListView::onClickTest1()
-{
-	llinfos << "test 1" << llendl;
-}
-
-void LLFloaterTestListView::onClickTest2()
-{
-	llinfos << "test 2" << llendl;
-}
diff --git a/indra/newview/llfloatertestlistview.h b/indra/newview/llfloatertestlistview.h
index 053da95def6db5ef5f7e7f857cf7f1ee3f6560af..0c47c2ee3194bd0e776d1c4e95741e756c44861f 100644
--- a/indra/newview/llfloatertestlistview.h
+++ b/indra/newview/llfloatertestlistview.h
@@ -34,31 +34,16 @@
 
 #include "llfloater.h"
 
-class LLListView;
 class LLSD;
 
 class LLFloaterTestListView : public LLFloater
 {
 	friend class LLFloaterReg;
-public:
-	// nothing yet
 
 private:
 	// Construction handled by LLFloaterReg
 	LLFloaterTestListView(const LLSD& seed);
 	~LLFloaterTestListView();
-
-	/*virtual*/ BOOL postBuild();
-
-	// Perform some debug action when the list-view sends change notification
-	void onListViewChanged();
-
-	// Debug function hookups for buttons
-	void onClickTest1();
-	void onClickTest2();
-
-private:
-	LLListView* mListView;
 };
 
 #endif
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index dbd36437423ef852bf3c073f20a86fd886efe09f..6ba032c152651f77d49c68a5c4b0e03f8f230396 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -52,6 +52,7 @@
 #include "llmediaentry.h"
 #include "llmediactrl.h"
 #include "llmenugl.h"
+#include "llnotificationsutil.h"
 #include "llpanelcontents.h"
 #include "llpanelface.h"
 #include "llpanelland.h"
@@ -1283,7 +1284,7 @@ void LLFloaterTools::onClickBtnAddMedia()
 	LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
 	if((tool != LLToolFace::getInstance()) || LLSelectMgr::getInstance()->getSelection()->isMultipleTESelected())
 	{
-		LLNotifications::instance().add("MultipleFacesSelected",LLSD(), LLSD(), multipleFacesSelectedConfirm);
+		LLNotificationsUtil::add("MultipleFacesSelected",LLSD(), LLSD(), multipleFacesSelectedConfirm);
 		
 	}
 	else
@@ -1296,7 +1297,7 @@ void LLFloaterTools::onClickBtnAddMedia()
 // static
 bool LLFloaterTools::multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch( option )
 	{
 		case 0:  // "Yes"
@@ -1322,14 +1323,14 @@ void LLFloaterTools::onClickBtnEditMedia()
 // called when a user wants to delete media from a prim or prim face
 void LLFloaterTools::onClickBtnDeleteMedia()
 {
-	LLNotifications::instance().add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
+	LLNotificationsUtil::add("DeleteMedia", LLSD(), LLSD(), deleteMediaConfirm);
 }
 
 
 // static
 bool LLFloaterTools::deleteMediaConfirm(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch( option )
 	{
 		case 0:  // "Yes"
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index bf5a1141a6c1d190408ba60122f1e693976908b5..86992d6a31fbbd20bb04cb667ad9b79eaab31cdc 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -41,6 +41,7 @@
 #include "llbutton.h"
 #include "llfloatergodtools.h"
 #include "llfloaterreg.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
@@ -359,7 +360,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)
 //static
 bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
 	if(!instance) return false;
 	if (option == 0)
@@ -371,7 +372,7 @@ bool LLFloaterTopObjects::callbackReturnAll(const LLSD& notification, const LLSD
 
 void LLFloaterTopObjects::onReturnAll()
 {	
-	LLNotifications::instance().add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
+	LLNotificationsUtil::add("ReturnAllTopObjects", LLSD(), LLSD(), &callbackReturnAll);
 }
 
 
@@ -384,7 +385,7 @@ void LLFloaterTopObjects::onReturnSelected()
 //static
 bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLFloaterTopObjects* instance = LLFloaterReg::getTypedInstance<LLFloaterTopObjects>("top_objects");
 	if(!instance) return false;
 	if (option == 0)
@@ -396,7 +397,7 @@ bool LLFloaterTopObjects::callbackDisableAll(const LLSD& notification, const LLS
 
 void LLFloaterTopObjects::onDisableAll()
 {
-	LLNotifications::instance().add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
+	LLNotificationsUtil::add("DisableAllTopObjects", LLSD(), LLSD(), callbackDisableAll);
 }
 
 void LLFloaterTopObjects::onDisableSelected()
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index 8d2d48f1af876bf5b4de26c5e7d36a23db3aaadb..69ee8cd54754e848e5231a91f2ee66a2b1ba4d83 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -40,8 +40,10 @@
 
 // linden library includes
 #include "llbutton.h"
+#include "llevents.h"
 #include "llhttpclient.h"
 #include "llhttpstatuscodes.h"	// for HTTP_FOUND
+#include "llnotificationsutil.h"
 #include "llradiogroup.h"
 #include "lltextbox.h"
 #include "llui.h"
@@ -207,7 +209,7 @@ void LLFloaterTOS::onCancel( void* userdata )
 {
 	LLFloaterTOS* self = (LLFloaterTOS*) userdata;
 	llinfos << "User disagrees with TOS." << llendl;
-	LLNotifications::instance().add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
+	LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
 
 	if(self->mReplyPumpName != "")
 	{
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index a1c6704657d9f8cc813615475168fe5bc20f4fb2..1e92ac0b8e50e559e2f04c75be698e918f3cbeed 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -45,11 +45,11 @@
 #include "llsdutil.h"
 #include "llxmltree.h"
 #include "llviewerwindow.h"
-#include "lllivefile.h"
 
 // XUI
 #include "lluictrlfactory.h"
 #include "llcombobox.h"
+#include "llnotificationsutil.h"
 #include "llresizebar.h"
 #include "llscrolllistitem.h"
 #include "llscrolllistctrl.h"
@@ -608,7 +608,7 @@ void LLFloaterUIPreview::popupAndPrintWarning(std::string& warning)
 	llwarns << warning << llendl;
 	LLSD args;
 	args["MESSAGE"] = warning;
-	LLNotifications::instance().add("GenericAlert", args);
+	LLNotificationsUtil::add("GenericAlert", args);
 }
 
 // Get localization string from drop-down menu
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 2b01a5637317da9d06bd4aed1edcc96b601a9314..5e769feea6158c776610ffa88d81970a0af1e434 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -37,8 +37,8 @@
 #include "llpanellandmedia.h"
 #include "llpanelface.h"
 
-// project includes
 #include "llcombobox.h"
+#include "llnotificationsutil.h"
 #include "llurlhistory.h"
 #include "lluictrlfactory.h"
 #include "llwindow.h"
@@ -263,13 +263,13 @@ void LLFloaterURLEntry::onBtnCancel( void* userdata )
 //-----------------------------------------------------------------------------
 void LLFloaterURLEntry::onBtnClear( void* userdata )
 {
-	LLNotifications::instance().add( "ConfirmClearMediaUrlList", LLSD(), LLSD(), 
+	LLNotificationsUtil::add( "ConfirmClearMediaUrlList", LLSD(), LLSD(), 
 									boost::bind(&LLFloaterURLEntry::callback_clear_url_list, (LLFloaterURLEntry*)userdata, _1, _2) );
 }
 
 bool LLFloaterURLEntry::callback_clear_url_list(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if ( option == 0 ) // YES
 	{
 		// clear saved list
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index a0fe42bf61763ed48f2c220c6bd64fdb94c8fa52..66a1f6701f4acc6a247387743fb258e296004513 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -47,6 +47,7 @@
 #include "llviewercamera.h"
 #include "llcombobox.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "llfloaterdaycycle.h"
 #include "llboost.h"
 #include "llmultisliderctrl.h"
@@ -159,7 +160,7 @@ void LLFloaterWater::initCallbacks(void) {
 bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if(text == "")
 	{
@@ -191,7 +192,7 @@ bool LLFloaterWater::newPromptCallback(const LLSD& notification, const LLSD& res
 		} 
 		else 
 		{
-			LLNotifications::instance().add("ExistsWaterPresetAlert");
+			LLNotificationsUtil::add("ExistsWaterPresetAlert");
 		}
 	}
 	return false;
@@ -503,7 +504,7 @@ void LLFloaterWater::onNormalMapPicked(LLUICtrl* ctrl)
 
 void LLFloaterWater::onNewPreset()
 {
-	LLNotifications::instance().add("NewWaterPreset", LLSD(),  LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
+	LLNotificationsUtil::add("NewWaterPreset", LLSD(),  LLSD(), boost::bind(&LLFloaterWater::newPromptCallback, this, _1, _2));
 }
 
 void LLFloaterWater::onSavePreset()
@@ -525,16 +526,16 @@ void LLFloaterWater::onSavePreset()
 		comboBox->getSelectedItemLabel());
 	if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("WaterEditPresets")) 
 	{
-		LLNotifications::instance().add("WLNoEditDefault");
+		LLNotificationsUtil::add("WLNoEditDefault");
 		return;
 	}
 
-	LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
+	LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWater::saveAlertCallback, this, _1, _2));
 }
 
 bool LLFloaterWater::saveAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	// if they choose save, do it.  Otherwise, don't do anything
 	if(option == 0) 
 	{
@@ -561,12 +562,12 @@ void LLFloaterWater::onDeletePreset()
 
 	LLSD args;
 	args["SKY"] = combo_box->getSelectedValue().asString();
-	LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
+	LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), boost::bind(&LLFloaterWater::deleteAlertCallback, this, _1, _2));
 }
 
 bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	// if they choose delete, do it.  Otherwise, don't do anything
 	if(option == 0) 
 	{
@@ -587,7 +588,7 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
 		std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
 		if(sIt != sDefaultPresets.end()) 
 		{
-			LLNotifications::instance().add("WaterNoEditDefault");
+			LLNotificationsUtil::add("WaterNoEditDefault");
 			return false;
 		}
 
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index 60494f3cce4c88609ff22fd10db54dccc3023a78..ea6fda7303c907b93cdf50c6fcc5acd6ac887cdc 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -41,6 +41,7 @@
 #include "llsliderctrl.h"
 #include "llmultislider.h"
 #include "llmultisliderctrl.h"
+#include "llnotificationsutil.h"
 #include "llspinctrl.h"
 #include "llcheckboxctrl.h"
 #include "lluictrlfactory.h"
@@ -210,7 +211,7 @@ void LLFloaterWindLight::initCallbacks(void) {
 bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if(text == "")
 	{
@@ -260,7 +261,7 @@ bool LLFloaterWindLight::newPromptCallback(const LLSD& notification, const LLSD&
 		} 
 		else 
 		{
-			LLNotifications::instance().add("ExistsSkyPresetAlert");
+			LLNotificationsUtil::add("ExistsSkyPresetAlert");
 		}
 	}
 	return false;
@@ -676,7 +677,7 @@ void LLFloaterWindLight::onStarAlphaMoved(LLUICtrl* ctrl)
 
 void LLFloaterWindLight::onNewPreset()
 {
-	LLNotifications::instance().add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
+	LLNotificationsUtil::add("NewSkyPreset", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::newPromptCallback, this, _1, _2));
 }
 
 void LLFloaterWindLight::onSavePreset()
@@ -696,19 +697,19 @@ void LLFloaterWindLight::onSavePreset()
 		comboBox->getSelectedItemLabel());
 	if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets")) 
 	{
-		LLNotifications::instance().add("WLNoEditDefault");
+		LLNotificationsUtil::add("WLNoEditDefault");
 		return;
 	}
 
 	LLWLParamManager::instance()->mCurParams.mName = 
 		comboBox->getSelectedItemLabel();
 
-	LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
+	LLNotificationsUtil::add("WLSavePresetAlert", LLSD(), LLSD(), boost::bind(&LLFloaterWindLight::saveAlertCallback, this, _1, _2));
 }
 
 bool LLFloaterWindLight::saveAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	// if they choose save, do it.  Otherwise, don't do anything
 	if(option == 0) 
 	{
@@ -734,13 +735,13 @@ void LLFloaterWindLight::onDeletePreset()
 
 	LLSD args;
 	args["SKY"] = combo_box->getSelectedValue().asString();
-	LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(), 
+	LLNotificationsUtil::add("WLDeletePresetAlert", args, LLSD(), 
 									boost::bind(&LLFloaterWindLight::deleteAlertCallback, this, _1, _2));
 }
 
 bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	// if they choose delete, do it.  Otherwise, don't do anything
 	if(option == 0) 
@@ -762,7 +763,7 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
 		std::set<std::string>::iterator sIt = sDefaultPresets.find(name);
 		if(sIt != sDefaultPresets.end()) 
 		{
-			LLNotifications::instance().add("WLNoEditDefault");
+			LLNotificationsUtil::add("WLNoEditDefault");
 			return false;
 		}
 
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 85847e5fce87fce9a41892d9c700d92aef6d9615..7ca491a6987f02c5d28535d45f0c131940b9c42e 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -54,6 +54,7 @@
 #include "llinventoryobserver.h"
 #include "lllandmarklist.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "llregionhandle.h"
 #include "llscrolllistctrl.h"
 #include "llslurl.h"
@@ -1213,7 +1214,7 @@ void LLFloaterWorldMap::onCopySLURL()
 	LLSD args;
 	args["SLURL"] = mSLURL;
 
-	LLNotifications::instance().add("CopySLURL", args);
+	LLNotificationsUtil::add("CopySLURL", args);
 }
 
 // protected
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index d85ac477e19d1ef4014f7b8c85e992c663da484d..18ff53c127d5cc13e2b3727d0d5c7dabfc3c1951 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -42,6 +42,7 @@
 #include "lldatapacker.h"
 #include "llinventory.h"
 #include "llmultigesture.h"
+#include "llnotificationsutil.h"
 #include "llstl.h"
 #include "llstring.h"	// todo: remove
 #include "llvfile.h"
@@ -72,6 +73,7 @@ LLGestureManager::LLGestureManager()
 	mActive(),
 	mLoadingCount(0)
 {
+	mRetryIfMissing = true;
 	gInventory.addObserver(this);
 }
 
@@ -971,7 +973,7 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 					// we're done with this set of deactivations
 					LLSD args;
 					args["NAMES"] = self.mDeactivateSimilarNames;
-					LLNotifications::instance().add("DeactivatedGesturesTrigger", args);
+					LLNotificationsUtil::add("DeactivatedGesturesTrigger", args);
 				}
 			}
 
@@ -983,7 +985,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
 			else
 			{
 				// Watch this item and set gesture name when item exists in inventory
-				self.watchItem(item_id);
+				item_ref_t ids;
+				ids.push_back(item_id);
+				self.fetchItems(ids);
 			}
 			self.mActive[item_id] = gesture;
 
@@ -1176,6 +1180,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)
 
 void LLGestureManager::done()
 {
+	bool notify = false;
 	for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)
 	{
 		if(it->second && it->second->mName.empty())
@@ -1184,10 +1189,14 @@ void LLGestureManager::done()
 			if(item)
 			{
 				it->second->mName = item->getName();
+				notify = true;
 			}
 		}
 	}
-	notifyObservers();
+	if(notify)
+	{
+		notifyObservers();
+	}
 }
 
 // static
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 094ca1379843e4a9f6e258c5e46860cb5dcd5f8e..e80eea9ae90accc48d0c310da5f828e979e68d41 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -54,7 +54,7 @@ class LLGestureManagerObserver
 	virtual void changed() = 0;
 };
 
-class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
+class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver
 {
 public:
 
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index f4e1951c7b2f9869bd504234702a55f82db61165..6fe8ed0e4d25c7be6520dd305f5ab6b73c04c06e 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -35,12 +35,12 @@
 
 #include "llgroupactions.h"
 
-// Viewer includes
 #include "llagent.h"
 #include "llcommandhandler.h"
 #include "llfloaterreg.h"
 #include "llgroupmgr.h"
 #include "llimview.h" // for gIMMgr
+#include "llnotificationsutil.h"
 #include "llsidetray.h"
 #include "llstatusbar.h"	// can_afford_transaction()
 #include "llimfloater.h"
@@ -132,11 +132,11 @@ void LLGroupActions::join(const LLUUID& group_id)
 
 		if (can_afford_transaction(cost))
 		{
-			LLNotifications::instance().add("JoinGroupCanAfford", args, payload, onJoinGroup);
+			LLNotificationsUtil::add("JoinGroupCanAfford", args, payload, onJoinGroup);
 		}
 		else
 		{
-			LLNotifications::instance().add("JoinGroupCannotAfford", args, payload);
+			LLNotificationsUtil::add("JoinGroupCannotAfford", args, payload);
 		}
 	}
 	else
@@ -149,7 +149,7 @@ void LLGroupActions::join(const LLUUID& group_id)
 // static
 bool LLGroupActions::onJoinGroup(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (option == 1)
 	{
@@ -181,7 +181,7 @@ void LLGroupActions::leave(const LLUUID& group_id)
 		args["GROUP"] = gAgent.mGroups.get(i).mName;
 		LLSD payload;
 		payload["group_id"] = group_id;
-		LLNotifications::instance().add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
+		LLNotificationsUtil::add("GroupLeaveConfirmMember", args, payload, onLeaveGroup);
 	}
 }
 
@@ -346,7 +346,7 @@ bool LLGroupActions::isAvatarMemberOfGroup(const LLUUID& group_id, const LLUUID&
 // static
 bool LLGroupActions::onLeaveGroup(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLUUID group_id = notification["payload"]["group_id"].asUUID();
 	if(option == 0)
 	{
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 59537c1e6518d0f40582f52add6d5849b3b5a51c..ebb5feb2bf6566633f525da7ed07b4ec1650d268 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -52,7 +52,7 @@
 #include "llviewerwindow.h"
 #include "llpanelgroup.h"
 #include "llgroupactions.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "lluictrlfactory.h"
 #include <boost/regex.hpp>
 
@@ -1295,7 +1295,7 @@ void LLGroupMgr::processCreateGroupReply(LLMessageSystem* msg, void ** data)
 		// *TODO: Translate
 		LLSD args;
 		args["MESSAGE"] = message;
-		LLNotifications::instance().add("UnableToCreateGroup", args);
+		LLNotificationsUtil::add("UnableToCreateGroup", args);
 	}
 }
 
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index ee93a9349ae5a147c956644d714f25f9114696f5..5e9ffdf4100b4e529b3807e6271bf15b5874e03a 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,6 +34,8 @@
 
 #include "llimfloater.h"
 
+#include "llnotificationsutil.h"
+
 #include "llagent.h"
 #include "llappviewer.h"
 #include "llbutton.h"
@@ -529,7 +531,6 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
 		//in disconnected state IM input editor should be disabled
 		self->mInputEditor->setEnabled(!gDisconnected);
 	}
-	self->mChatHistory->setCursorAndScrollToEnd();
 }
 
 // static
@@ -635,6 +636,9 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
 				else
 					label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
 				mInputEditor->setLabel(label);
+
+				if (moderator_muted_text)
+					LLNotificationsUtil::add("TextChatIsMutedByModerator");
 			}
 		}
 	}
diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp
index c081af587938c392a3c556ffe932919c972a3bf7..1cbd273e96aaf475b3805393d32ca96fd5433d18 100644
--- a/indra/newview/llimhandler.cpp
+++ b/indra/newview/llimhandler.cpp
@@ -36,6 +36,7 @@
 #include "llnotificationhandler.h"
 
 #include "llagentdata.h"
+#include "llnotifications.h"
 #include "lltoastimpanel.h"
 #include "llviewerwindow.h"
 
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index ffa943092f41c6f5f49ddcff5be4ef72175f4b70..be719c0a7839f85a9f149e3ad914da515780a053 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -70,6 +70,8 @@
 #include "lltoolbar.h"
 #include "llviewermessage.h"
 #include "llviewerwindow.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llnearbychat.h"
 #include "llviewerregion.h"
@@ -120,7 +122,7 @@ void toast_callback(const LLSD& msg){
 	args["FROM_ID"] = msg["from_id"];
 	args["SESSION_ID"] = msg["session_id"];
 
-	LLNotifications::instance().add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
+	LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID()));
 }
 
 void LLIMModel::setActiveSessionID(const LLUUID& session_id)
@@ -163,6 +165,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 	{
 		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
 	}
+
+	if(mVoiceChannel)
+	{
+		mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
+	}
 	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
 
 	// All participants will be added to the list of people we've recently interacted with.
@@ -189,6 +196,56 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
 		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
 }
 
+void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+	bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);
+	bool is_incoming_call = false;
+	std::string other_avatar_name;
+
+	if(is_p2p_session)
+	{
+		is_incoming_call = static_cast<LLVoiceChannelP2P*>(mVoiceChannel)->isIncomingCall();
+		gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
+
+		if(is_incoming_call)
+		{
+			switch(new_state)
+			{
+			case LLVoiceChannel::STATE_CALL_STARTED :
+				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
+				break;
+			case LLVoiceChannel::STATE_CONNECTED :
+				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
+			default:
+				break;
+			}
+		}
+		else // outgoing call
+		{
+			switch(new_state)
+			{
+			case LLVoiceChannel::STATE_CALL_STARTED :
+				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
+				break;
+			case LLVoiceChannel::STATE_CONNECTED :
+				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
+			default:
+				break;
+			}
+		}
+
+		// Update speakers list when connected
+		if (LLVoiceChannel::STATE_CONNECTED == new_state)
+		{
+			mSpeakers->update(true);
+		}
+	}
+	else  // group || ad-hoc calls
+	{
+
+	}
+}
+
 LLIMModel::LLIMSession::~LLIMSession()
 {
 	delete mSpeakers;
@@ -394,6 +451,19 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
 	return true;
 }
 
+bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+	{
+		LLLogChat::saveHistory(session_name, from, from_id, utf8_text);
+		return true;
+	}
+	else
+	{
+		return false;
+	}
+}
+
 bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
 {
 	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
@@ -428,7 +498,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
 						   const std::string& utf8_text, bool log2file /* = true */) { 
 	LLIMSession* session = findIMSession(session_id);
 
-	if (!session) 
+	if (!session)
 	{
 		llwarns << "session " << session_id << "does not exist " << llendl;
 		return false;
@@ -1015,7 +1085,7 @@ LLIMMgr::showSessionStartError(
 	LLSD payload;
 	payload["session_id"] = session_id;
 
-	LLNotifications::instance().add(
+	LLNotificationsUtil::add(
 		"ChatterBoxSessionStartError",
 		args,
 		payload,
@@ -1038,7 +1108,7 @@ LLIMMgr::showSessionEventError(
 		LLTrans::getString(event_string);
 	args["RECIPIENT"] = floater->getTitle();
 
-	LLNotifications::instance().add(
+	LLNotificationsUtil::add(
 		"ChatterBoxSessionEventError",
 		args);
 }
@@ -1059,7 +1129,7 @@ LLIMMgr::showSessionForceClose(
 	LLSD payload;
 	payload["session_id"] = session_id;
 
-	LLNotifications::instance().add(
+	LLNotificationsUtil::add(
 		"ForceCloseChatterBoxSession",
 		args,
 		payload,
@@ -1148,7 +1218,7 @@ BOOL LLOutgoingCallDialog::postBuild()
 	childSetAction("Cancel", onCancel, this);
 
 	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
 					 this, getDockTongue(), LLDockControl::TOP,
 					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
 
@@ -1225,7 +1295,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)
 	}
 
 	// dock the dialog to the sys well, where other sys messages appear
-	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
 									 this, getDockTongue(), LLDockControl::TOP,
 									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
 }
@@ -1363,7 +1433,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
 	LLUUID session_id = payload["session_id"].asUUID();
 	EInstantMessage type = (EInstantMessage)payload["type"].asInteger();
 	LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option) 
 	{
 	case 0: // accept
@@ -1876,7 +1946,7 @@ void LLIMMgr::inviteToSession(
 				args["NAME"] = caller_name;
 				args["GROUP"] = session_name;
 
-				LLNotifications::instance().add(notify_box_type, args, payload, &inviteUserResponse);
+				LLNotificationsUtil::add(notify_box_type, args, payload, &inviteUserResponse);
 			}
 		}
 		mPendingInvitations[session_id.asString()] = LLSD();
@@ -1899,7 +1969,7 @@ void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::stri
 		LLSD args;
 		args["NAME"] = payload["caller_name"].asString();
 	
-		LLNotifications::instance().add(
+		LLNotificationsUtil::add(
 			payload["notify_box_type"].asString(),
 			args, 
 			payload,
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 62a54bc0815fe2ea3aca2852e8584dd3f617052b..40e3a8fb692ce6d8aaa870d91a97f395bfe623b6 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -61,6 +61,7 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 		void sessionInitReplyReceived(const LLUUID& new_session_id);
 		void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
+		void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
 		static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
 
 		LLUUID mSessionID;
@@ -199,6 +200,11 @@ class LLIMModel :  public LLSingleton<LLIMModel>
 
 	void testMessages();
 
+	/**
+	 * Saves an IM message into a file
+	 */
+	bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+
 private:
 	
 	/**
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index e3780f93ff69e4a709c353de64b7c46d2aa2b273..42d061ff7257023bdde20aeab2479657339f82ba 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -36,7 +36,7 @@
 // Viewer
 #include "llinspect.h"
 #include "llmediaentry.h"
-#include "llnotifications.h"	// *TODO: Eliminate, add LLNotificationsUtil wrapper
+#include "llnotificationsutil.h"	// *TODO: Eliminate, add LLNotificationsUtil wrapper
 #include "llselectmgr.h"
 #include "llslurl.h"
 #include "llviewermenu.h"		// handle_object_touch(), handle_buy()
@@ -631,7 +631,7 @@ void LLInspectObject::onClickOpen()
 void LLInspectObject::onClickMoreInfo()
 {
 	// *TODO: Show object info side panel, once that is implemented.
-	LLNotifications::instance().add("ClickUnimplemented");
+	LLNotificationsUtil::add("ClickUnimplemented");
 	closeFloater();
 }
 
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 5b49ccb5df5eefc2f29cde88d323b1ce661a8b97..a44ce07d764923a350cec7abaf6d6d1fc4746d64 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -50,6 +50,8 @@
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"
 #include "llinventorypanel.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llpreviewanim.h"
 #include "llpreviewgesture.h"
 #include "llpreviewtexture.h"
@@ -1703,7 +1705,7 @@ void warn_move_inventory(LLViewerObject* object, LLMoveInv* move_inv)
 	{
 		dialog = "MoveInventoryFromObject";
 	}
-	LLNotifications::instance().add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
+	LLNotificationsUtil::add(dialog, LLSD(), LLSD(), boost::bind(move_task_inventory_callback, _1, _2, move_inv));
 }
 
 // Move/copy all inventory items from the Contents folder of an in-world
@@ -2762,7 +2764,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
 {
 	LLFloaterOpenObject::LLCatAndWear* cat_and_wear = (LLFloaterOpenObject::LLCatAndWear* )move_inv->mUserData;
 	LLViewerObject* object = gObjectList.findObject(move_inv->mObjectID);
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if(option == 0 && object)
 	{
@@ -2851,7 +2853,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
 										BOOL drop)
 {
 	LLInventoryModel* model = getInventoryModel();
-	if(!model) return FALSE;
+	if(!model || !inv_item) return FALSE;
 
 	// cannot drag into library
 	if(!isAgentInventory())
@@ -3335,7 +3337,7 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
 
 static bool open_landmark_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	LLUUID asset_id = notification["payload"]["asset_id"].asUUID();
 	if (option == 0)
@@ -3365,7 +3367,7 @@ void LLLandmarkBridge::openItem()
 		// open_landmark(item);
 		LLSD payload;
 		payload["asset_id"] = item->getAssetUUID();
-		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+		LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
 	}
 */
 }
@@ -3992,7 +3994,7 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
 #if !ENABLE_MULTIATTACHMENTS
 	if (attachment && attachment->getNumObjects() > 0)
 	{
-		LLNotifications::instance().add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
+		LLNotificationsUtil::add("ReplaceAttachment", LLSD(), payload, confirm_replace_attachment_rez);
 	}
 	else
 #endif
@@ -4009,11 +4011,11 @@ bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& respon
 	{
 		LLSD args;
 		args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
-		LLNotifications::instance().add("MaxAttachmentsOnOutfit", args);
+		LLNotificationsUtil::add("MaxAttachmentsOnOutfit", args);
 		return false;
 	}
 
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0/*YES*/)
 	{
 		LLViewerInventoryItem* itemp = gInventory.getItem(notification["payload"]["item_id"].asUUID());
@@ -4426,7 +4428,7 @@ void LLWearableBridge::openItem()
 	/*
 	if( isInTrash() )
 	{
-		LLNotifications::instance().add("CannotWearTrash");
+		LLNotificationsUtil::add("CannotWearTrash");
 	}
 	else if(isAgentInventory())
 	{
@@ -4455,7 +4457,7 @@ void LLWearableBridge::openItem()
 		{
 			// *TODO: We should fetch the item details, and then do
 			// the operation above.
-			LLNotifications::instance().add("CannotWearInfoNotComplete");
+			LLNotificationsUtil::add("CannotWearInfoNotComplete");
 		}
 	}
 	*/
@@ -4569,7 +4571,7 @@ void LLWearableBridge::wearOnAvatar()
 	// destroy clothing items.
 	if (!gAgentWearables.areWearablesLoaded())
 	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 		return;
 	}
 
@@ -4600,7 +4602,7 @@ void LLWearableBridge::wearAddOnAvatar()
 	// destroy clothing items.
 	if (!gAgentWearables.areWearablesLoaded())
 	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 		return;
 	}
 
@@ -4901,7 +4903,7 @@ void	LLLandmarkBridgeAction::doIt()
 		// but warns you the first time.
 		LLSD payload;
 		payload["asset_id"] = item->getAssetUUID();
-		LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+		LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
 	}
 
 	LLInvFVBridgeAction::doIt();
@@ -5001,7 +5003,7 @@ void LLWearableBridgeAction::wearOnAvatar()
 	// destroy clothing items.
 	if (!gAgentWearables.areWearablesLoaded())
 	{
-		LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+		LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 		return;
 	}
 
@@ -5031,7 +5033,7 @@ void LLWearableBridgeAction::doIt()
 {
 	if(isInTrash())
 	{
-		LLNotifications::instance().add("CannotWearTrash");
+		LLNotificationsUtil::add("CannotWearTrash");
 	}
 	else if(isAgentInventory())
 	{
@@ -5060,7 +5062,7 @@ void LLWearableBridgeAction::doIt()
 		{
 			// *TODO: We should fetch the item details, and then do
 			// the operation above.
-			LLNotifications::instance().add("CannotWearInfoNotComplete");
+			LLNotificationsUtil::add("CannotWearInfoNotComplete");
 		}
 	}
 
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 9e37c5be3834661ce4f883068b27b922286cb5e5..9f96ebc36628a68fa26f61ebcf9822c8bf43a569 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -40,6 +40,7 @@
 #include "llinventorybridge.h"
 #include "llinventoryfunctions.h"
 #include "llinventoryobserver.h"
+#include "llnotificationsutil.h"
 #include "llwindow.h"
 #include "llviewercontrol.h"
 #include "llpreview.h" 
@@ -3419,7 +3420,7 @@ void LLInventoryModel::processMoveInventoryItem(LLMessageSystem* msg, void**)
 
 bool LLInventoryModel::callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0) // YES
 	{
 		const LLUUID folder_id = findCategoryUUIDForType(preferred_type);
@@ -3433,7 +3434,7 @@ void LLInventoryModel::emptyFolderType(const std::string notification, LLFolderT
 {
 	if (!notification.empty())
 	{
-		LLNotifications::instance().add(notification, LLSD(), LLSD(),
+		LLNotificationsUtil::add(notification, LLSD(), LLSD(),
 										boost::bind(&LLInventoryModel::callbackEmptyFolderType, this, _1, _2, preferred_type));
 	}
 	else
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 315fce5575d9ded478a21a4c472e231d540ff539..2d9ea21b5f2ccc390edad2323de7688197107bdb 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -55,7 +55,7 @@
 #include "lldbstrings.h"
 #include "llviewerstats.h"
 #include "llmutelist.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llcallbacklist.h"
 #include "llpreview.h"
 #include "llviewercontrol.h"
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index d50b68b624071dd0028eeb60fa711e7f67607677..08d56f8b9f0b0e3b816749c494942e0074cabf93 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -39,7 +39,7 @@
 #include "lllandmark.h"
 #include "llparcel.h"
 
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 #include "llagent.h"
 #include "llagentui.h"
@@ -267,7 +267,7 @@ void LLLandmarkActions::createLandmarkHere(
 	}
 	if (!canCreateLandmarkHere())
 	{
-		LLNotifications::instance().add("CannotCreateLandmarkNotOwner");
+		LLNotificationsUtil::add("CannotCreateLandmarkNotOwner");
 		return;
 	}
 
@@ -420,5 +420,5 @@ void copy_slurl_to_clipboard_callback(const std::string& slurl)
 	gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(slurl));
 	LLSD args;
 	args["SLURL"] = slurl;
-	LLNotifications::instance().add("CopySLURL", args);
+	LLNotificationsUtil::add("CopySLURL", args);
 }
diff --git a/indra/newview/lllandmarklist.cpp b/indra/newview/lllandmarklist.cpp
index 83e694951b56a0ba08a9cc63027f53bf517dc335..d613cf6ba472acdfedd2e337f70a6ca913446352 100644
--- a/indra/newview/lllandmarklist.cpp
+++ b/indra/newview/lllandmarklist.cpp
@@ -146,12 +146,12 @@ void LLLandmarkList::processGetAssetReply(
 		if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status )
 		{
 			LL_WARNS("Landmarks") << "Missing Landmark" << LL_ENDL;
-			//LLNotifications::instance().add("LandmarkMissing");
+			//LLNotificationsUtil::add("LandmarkMissing");
 		}
 		else
 		{
 			LL_WARNS("Landmarks") << "Unable to load Landmark" << LL_ENDL;
-			//LLNotifications::instance().add("UnableToLoadLandmark");
+			//LLNotificationsUtil::add("UnableToLoadLandmark");
 		}
 
 		gLandmarkList.mBadList.insert(uuid);
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 6b28edf0b631699890b0dbeaa1ae416c252086aa..45c60df84f8e143b9f574516bed5020b007175b0 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -158,8 +158,10 @@ LLLocationInputCtrl::Params::Params()
 	add_landmark_image_disabled("add_landmark_image_disabled"),
 	add_landmark_image_hover("add_landmark_image_hover"),
 	add_landmark_image_selected("add_landmark_image_selected"),
+	add_landmark_hpad("add_landmark_hpad", 0),
 	icon_hpad("icon_hpad", 0),
 	add_landmark_button("add_landmark_button"),
+	for_sale_button("for_sale_button"),
 	info_button("info_button"),
 	voice_icon("voice_icon"),
 	fly_icon("fly_icon"),
@@ -174,9 +176,11 @@ LLLocationInputCtrl::Params::Params()
 LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 :	LLComboBox(p),
 	mIconHPad(p.icon_hpad),
-	mInfoBtn(NULL),
+	mAddLandmarkHPad(p.add_landmark_hpad),
 	mLocationContextMenu(NULL),
 	mAddLandmarkBtn(NULL),
+	mForSaleBtn(NULL),
+	mInfoBtn(NULL),
 	mLandmarkImageOn(NULL),
 	mLandmarkImageOff(NULL)
 {
@@ -237,6 +241,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
 	mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
 	enableAddLandmarkButton(true);
 	addChild(mAddLandmarkBtn);
+	
+	LLButton::Params for_sale_button = p.for_sale_button;
+	for_sale_button.click_callback.function(
+		boost::bind(&LLLocationInputCtrl::onForSaleButtonClicked, this));
+	mForSaleBtn = LLUICtrlFactory::create<LLButton>( for_sale_button );
+	// *TODO: Make clickable?
+	addChild(mForSaleBtn);
 
 	// Parcel property icons
 	LLIconCtrl::Params voice_icon = p.voice_icon;
@@ -465,6 +476,11 @@ void LLLocationInputCtrl::onInfoButtonClicked()
 	LLSideTray::getInstance()->showPanel("panel_places", LLSD().insert("type", "agent"));
 }
 
+void LLLocationInputCtrl::onForSaleButtonClicked()
+{
+	handle_buy_land();
+}
+
 void LLLocationInputCtrl::onAddLandmarkButtonClicked()
 {
 	LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
@@ -605,6 +621,20 @@ void LLLocationInputCtrl::refreshLocation()
 	setText(location_name);
 }
 
+// returns new right edge
+static S32 layout_widget(LLUICtrl* widget, S32 right)
+{
+	if (widget->getVisible())
+	{
+		LLRect rect = widget->getRect();
+		rect.mLeft = right - rect.getWidth();
+		rect.mRight = right;
+		widget->setRect( rect );
+		right -= rect.getWidth();
+	}
+	return right;
+}
+
 void LLLocationInputCtrl::refreshParcelIcons()
 {
 	// Our "cursor" moving right to left
@@ -614,8 +644,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
 	if (show_properties)
 	{
 		LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
-		// *TODO buy
-		//bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
+		bool allow_buy      = vpm->canAgentBuyParcel( vpm->getAgentParcel(), false);
 		bool allow_voice	= vpm->allowAgentVoice();
 		bool allow_fly		= vpm->allowAgentFly();
 		bool allow_push		= vpm->allowAgentPush();
@@ -624,6 +653,7 @@ void LLLocationInputCtrl::refreshParcelIcons()
 		bool allow_damage	= vpm->allowAgentDamage();
 		
 		// Most icons are "block this ability"
+		mForSaleBtn->setVisible(allow_buy);
 		mParcelIcon[VOICE_ICON]->setVisible(   !allow_voice );
 		mParcelIcon[FLY_ICON]->setVisible(     !allow_fly );
 		mParcelIcon[PUSH_ICON]->setVisible(    !allow_push );
@@ -632,28 +662,22 @@ void LLLocationInputCtrl::refreshParcelIcons()
 		mParcelIcon[DAMAGE_ICON]->setVisible(  allow_damage );
 		mDamageText->setVisible(allow_damage);
 		
-		// Slide the parcel icons rect from right to left, adjusting rectangles of
-		// visible icons.  Assumes all icon rects are the same.
+		x = layout_widget(mForSaleBtn, x);
+		// Padding goes to left of both landmark star and for sale btn
+		x -= mAddLandmarkHPad;
+		
+		// Slide the parcel icons rect from right to left, adjusting rectangles
 		for (S32 i = 0; i < ICON_COUNT; ++i)
 		{
-			LLIconCtrl* icon = mParcelIcon[i];
-			if (icon->getVisible())
-			{
-				LLRect r = icon->getRect();
-				r.mLeft = x - r.getWidth();
-				r.mRight = x;
-				icon->setRect( r );
-				x -= r.getWidth() + mIconHPad;
-			}
+			x = layout_widget(mParcelIcon[i], x);
+			x -= mIconHPad;
 		}
-		LLRect text_rect = mDamageText->getRect();
-		text_rect.mLeft = x - text_rect.getWidth();
-		text_rect.mRight = x;
-		mDamageText->setRect(text_rect);
-		x -= text_rect.getWidth() + mIconHPad;
+		x = layout_widget(mDamageText, x);
+		x -= mIconHPad;
 	}
 	else
 	{
+		mForSaleBtn->setVisible(false);
 		for (S32 i = 0; i < ICON_COUNT; ++i)
 		{
 			mParcelIcon[i]->setVisible(false);
@@ -664,8 +688,6 @@ void LLLocationInputCtrl::refreshParcelIcons()
 	S32 left_pad, right_pad;
 	mTextEntry->getTextPadding(&left_pad, &right_pad);
 	right_pad = mTextEntry->getRect().mRight - x;
-	llinfos << "JAMESDEBUG text entry rect " << mTextEntry->getRect()
-	<< " x " << x << " left_pad " << left_pad << " right_pad " << right_pad << llendl;
 	mTextEntry->setTextPadding(left_pad, right_pad);
 }
 
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 3bd23e80a98a4ad615d3418ccc3f5afe07d3c386..0211062b053669b05b1b1633afb249ea17227b28 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -65,8 +65,10 @@ class LLLocationInputCtrl
 											add_landmark_image_disabled,
 											add_landmark_image_hover,
 											add_landmark_image_selected;
-		Optional<S32>						icon_hpad;
+		Optional<S32>						icon_hpad,
+											add_landmark_hpad;
 		Optional<LLButton::Params>			add_landmark_button,
+											for_sale_button,
 											info_button;
 		Optional<LLIconCtrl::Params>		voice_icon,
 											fly_icon,
@@ -130,6 +132,7 @@ class LLLocationInputCtrl
 	void					onLocationPrearrange(const LLSD& data);
 	void 					onTextEditorRightClicked(S32 x, S32 y, MASK mask);
 	void					onLandmarkLoaded(LLLandmark* lm);
+	void					onForSaleButtonClicked();
 	void					onAddLandmarkButtonClicked();
 	void					onAgentParcelChange();
 	// callbacks
@@ -138,8 +141,10 @@ class LLLocationInputCtrl
 
 	LLMenuGL*				mLocationContextMenu;
 	LLButton*				mAddLandmarkBtn;
+	LLButton*				mForSaleBtn;
 	LLButton*				mInfoBtn;
-	S32						mIconHPad;
+	S32						mIconHPad;			// pad between all icons
+	S32						mAddLandmarkHPad;	// pad to left of landmark star
 	
 	enum EParcelIcon
 	{
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 941ccc227cd5abc2933d636faedd6812eea50560..9caa863bd81e93d997926b21950eca27803f3c6b 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -77,12 +77,12 @@ std::string LLLogChat::timestamp(bool withdate)
 		          +LLTrans::getString ("TimeMonth")+"]/["
 				  +LLTrans::getString ("TimeDay")+"] ["
 				  +LLTrans::getString ("TimeHour")+"]:["
-				  +LLTrans::getString ("TimeMin")+"] ";
+				  +LLTrans::getString ("TimeMin")+"]";
 	}
 	else
 	{
 		timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
-			      + LLTrans::getString ("TimeMin")+"] "; 
+			      + LLTrans::getString ("TimeMin")+"]";
 	}
 
 	LLStringUtil::format (timeStr, substitution);
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 2376a3581db53c58c6fe896cbd5a40ee5afaf4e1..f32866b1fea7dc0fea5fd4920aaf3115442bdca7 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -45,7 +45,7 @@
 #include "llviewermedia.h"
 #include "llviewertexture.h"
 #include "llviewerwindow.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llweb.h"
 #include "llrender.h"
 #include "llpluginclassmedia.h"
@@ -839,7 +839,7 @@ void LLMediaCtrl::convertInputCoords(S32& x, S32& y)
 // static 
 bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if ( 0 == option )
 	{
 		// open in external browser because we don't support 
@@ -969,7 +969,7 @@ void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
 			mExternalUrl = url;
 			LLSD payload;
 			payload["external_url"] = mExternalUrl;
-			LLNotifications::instance().add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
+			LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
 			return;
 		}
 	}
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index badef4c7ae8039213a6777fc5f6a3eb622f31bc3..3c337961e1af2bdec6a2737a99416187875d1714 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -260,7 +260,8 @@ void LLMediaDataClient::Responder::result(const LLSD& content)
 //
 //////////////////////////////////////////////////////////////////////////////////////
 
-bool LLMediaDataClient::Comparator::operator() (const request_ptr_t &o1, const request_ptr_t &o2) const
+// static
+bool LLMediaDataClient::compareRequests(const request_ptr_t &o1, const request_ptr_t &o2)
 {
 	if (o2.isNull()) return true;
 	if (o1.isNull()) return false;
@@ -277,20 +278,13 @@ bool LLMediaDataClient::Comparator::operator() (const request_ptr_t &o1, const r
 	// 3: One item with an impl, another without: item with impl wins 
 	//	  (XXX is that what we want?)		 
 	// Calculate the scores for each.  
-	F64 o1_score = Comparator::getObjectScore(o1->getObject());
-	F64 o2_score = Comparator::getObjectScore(o2->getObject());
-
-    // XXX Weird: a higher score should go earlier, but by observation I notice
-    // that this causes further-away objects load first.  This is counterintuitive
-    // to the priority_queue Comparator, which states that this function should
-    // return 'true' if o1 should be *before* o2.
-    // In other words, I'd have expected that the following should return
-    // ( o1_score > o2_score).
-	return ( o1_score < o2_score );
+	F64 o1_score = getObjectScore(o1->getObject());
+	F64 o2_score = getObjectScore(o2->getObject());
+	return ( o1_score > o2_score );
 }
-	
+
 // static
-F64 LLMediaDataClient::Comparator::getObjectScore(const LLMediaDataClientObject::ptr_t &obj)
+F64 LLMediaDataClient::getObjectScore(const LLMediaDataClientObject::ptr_t &obj)
 {
 	// *TODO: make this less expensive?
 	F64 dist = obj->getDistanceFromAvatar() + 0.1;	 // avoids div by 0
@@ -310,12 +304,12 @@ F64 LLMediaDataClient::Comparator::getObjectScore(const LLMediaDataClientObject:
 //////////////////////////////////////////////////////////////////////////////////////
 
 // dump the queue
-std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::PriorityQueue &q)
+std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::request_queue_t &q)
 {
 	int i = 0;
-	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator iter = q.c.begin();
-	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator end = q.c.end();
-	while (iter < end)
+	LLMediaDataClient::request_queue_t::const_iterator iter = q.begin();
+	LLMediaDataClient::request_queue_t::const_iterator end = q.end();
+	while (iter != end)
 	{
 		s << "\t" << i << "]: " << (*iter)->getObject()->getID().asString();
 		iter++;
@@ -325,11 +319,11 @@ std::ostream& operator<<(std::ostream &s, const LLMediaDataClient::PriorityQueue
 }
 
 // find the given object in the queue.
-bool LLMediaDataClient::PriorityQueue::find(const LLMediaDataClientObject::ptr_t &obj) const
+bool LLMediaDataClient::find(const LLMediaDataClientObject::ptr_t &obj) const
 {
-	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator iter = c.begin();
-	std::vector<LLMediaDataClient::request_ptr_t>::const_iterator end = c.end();
-	while (iter < end)
+	request_queue_t::const_iterator iter = pRequestQueue->begin();
+	request_queue_t::const_iterator end = pRequestQueue->end();
+	while (iter != end)
 	{
 		if (obj->getID() == (*iter)->getObject()->getID())
 		{
@@ -370,13 +364,17 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 		return TRUE;
 	}
 	
-	LLMediaDataClient::PriorityQueue &queue = *(mMDC->pRequestQueue);
+	request_queue_t &queue = *(mMDC->pRequestQueue);
 
 	if(!queue.empty())
 	{
 		LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, queue is:	  " << queue << LL_ENDL;
-	}
 
+		// Re-sort the list every time...
+		// XXX Is this really what we want?
+		queue.sort(LLMediaDataClient::compareRequests);
+	}
+	
 	// quick retry loop for cases where we shouldn't wait for the next timer tick
 	while(true)
 	{
@@ -387,7 +385,7 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 		}
 	
 		// Peel one off of the items from the queue, and execute request
-		request_ptr_t request = queue.top();
+		request_ptr_t request = queue.front();
 		llassert(!request.isNull());
 		const LLMediaDataClientObject *object = (request.isNull()) ? NULL : request->getObject();
 		bool performed_request = false;
@@ -398,7 +396,7 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 		{
 			// This object has been marked dead.  Pop it and move on to the next item in the queue immediately.
 			LL_INFOS("LLMediaDataClient") << "Skipping " << *request << ": object is dead!" << LL_ENDL;
-			queue.pop();
+			queue.pop_front();
 			continue;	// jump back to the start of the quick retry loop
 		}
 
@@ -442,7 +440,7 @@ BOOL LLMediaDataClient::QueueTimer::tick()
 											  << mMDC->mMaxNumRetries << " tries...popping object id " << object->getID() << LL_ENDL; 
 				// XXX Should we bring up a warning dialog??
 			}
-			queue.pop();
+			queue.pop_front();
 		}
 		else {
 			request->incRetryCount();
@@ -451,7 +449,7 @@ BOOL LLMediaDataClient::QueueTimer::tick()
  		// end of quick retry loop -- any cases where we want to loop will use 'continue' to jump back to the start.
  		break;
 	}  
-	
+
 	LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() finished, queue is now: " << (*(mMDC->pRequestQueue)) << LL_ENDL;
 
 	return queue.empty();
@@ -488,7 +486,7 @@ void LLMediaDataClient::enqueue(const Request *request)
 	LL_INFOS("LLMediaDataClient") << "Queuing request for " << *request << LL_ENDL;
 	// Push the request on the priority queue
 	// Sadly, we have to const-cast because items put into the queue are not const
-	pRequestQueue->push(const_cast<LLMediaDataClient::Request*>(request));
+	pRequestQueue->push_back(const_cast<LLMediaDataClient::Request*>(request));
 	LL_DEBUGS("LLMediaDataClient") << "Queue:" << (*pRequestQueue) << LL_ENDL;
 	// Start the timer if not already running
 	startQueueTimer();
@@ -508,7 +506,7 @@ LLMediaDataClient::LLMediaDataClient(F32 queue_timer_delay,
 	  mMaxNumRetries(max_retries),
 	  mQueueTimerIsRunning(false)
 {
-	pRequestQueue = new PriorityQueue();
+	pRequestQueue = new request_queue_t();
 }
 
 LLMediaDataClient::~LLMediaDataClient()
@@ -529,7 +527,7 @@ bool LLMediaDataClient::isEmpty() const
 
 bool LLMediaDataClient::isInQueue(const LLMediaDataClientObject::ptr_t &object) const
 {
-	return (NULL == pRequestQueue) ? false : pRequestQueue->find(object);
+	return (NULL == pRequestQueue) ? false : find(object);
 }
 
 //////////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index d5dd050111faec3400001a7cbed9b27316eb1745..812e9cbdec808b7308ba1ada10d0b4a5b400ecfc 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -195,30 +195,14 @@ class LLMediaDataClient : public LLRefCount
 	
 private:
 	
-	// Comparator for PriorityQueue
-	class Comparator
-	{
-	public:
-		bool operator() (const request_ptr_t &o1, const request_ptr_t &o2) const;
-	private:
-		static F64 getObjectScore(const LLMediaDataClientObject::ptr_t &obj);
-	};
+	typedef std::list<request_ptr_t> request_queue_t;
 	
-    // PriorityQueue
-	class PriorityQueue : public std::priority_queue<
-		request_ptr_t, 
-		std::vector<request_ptr_t>, 
-		Comparator >
-	{
-	public:
-		// Return whether the given object is in the queue
-		bool find(const LLMediaDataClientObject::ptr_t &obj) const;
-		
-		friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q);
-	};
+	// Comparator for sorting
+	static bool compareRequests(const request_ptr_t &o1, const request_ptr_t &o2);
+	static F64 getObjectScore(const LLMediaDataClientObject::ptr_t &obj);
     
 	friend std::ostream& operator<<(std::ostream &s, const Request &q);
-    friend std::ostream& operator<<(std::ostream &s, const PriorityQueue &q);
+	friend std::ostream& operator<<(std::ostream &s, const request_queue_t &q);
 
 	class QueueTimer : public LLEventTimer
 	{
@@ -232,6 +216,9 @@ class LLMediaDataClient : public LLRefCount
 		LLPointer<LLMediaDataClient> mMDC;
 	};
 
+	// Return whether the given object is in the queue
+	bool find(const LLMediaDataClientObject::ptr_t &obj) const;
+	
 	void startQueueTimer();
 	void stopQueueTimer();
 	void setIsRunning(bool val) { mQueueTimerIsRunning = val; }
@@ -242,7 +229,7 @@ class LLMediaDataClient : public LLRefCount
 	
 	bool mQueueTimerIsRunning;
 	
-	PriorityQueue *pRequestQueue;
+	request_queue_t *pRequestQueue;
 };
 
 
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 36cf2c1aa85b061815b03cf3e50419f284fa6ce0..b520bc1c2d37e0a28e791ec880ccdb464828bc52 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -298,7 +298,7 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
 	if ((mute.mType == LLMute::AGENT)
 		&& isLinden(mute.mName) && (flags & LLMute::flagTextChat || flags == 0))
 	{
-		LLNotifications::instance().add("MuteLinden");
+		LLNotifications::instance().add("MuteLinden", LLSD(), LLSD());
 		return FALSE;
 	}
 	
@@ -517,7 +517,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n
 	args["FIRST"] = first_name;
 	args["LAST"] = last_name;
     
-	LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args);
+	LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args, LLSD());
 	if (notif_ptr)
 	{
 		std::string message = notif_ptr->getMessage();
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 80a6cc343fae56c615ffa23e316ff280c5261b87..8f1dec14319e4d00b07c57e41648bd3863f4bb1e 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -130,6 +130,21 @@ void    LLNearbyChat::applySavedVariables()
 	}
 }
 
+std::string appendTime()
+{
+	time_t utc_time;
+	utc_time = time_corrected();
+	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+		+LLTrans::getString("TimeMin")+"] ";
+
+	LLSD substitution;
+
+	substitution["datetime"] = (S32) utc_time;
+	LLStringUtil::format (timeStr, substitution);
+
+	return timeStr;
+}
+
 void	LLNearbyChat::addMessage(const LLChat& chat)
 {
 	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
@@ -150,11 +165,18 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 			return;
 		}
 	}
+
+	bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
 	
 	if (!chat.mMuted)
 	{
 		std::string message = chat.mText;
-		std::string prefix = message.substr(0, 4);
+
+
+		LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+		if(tmp_chat.mTimeStr.empty())
+			tmp_chat.mTimeStr = appendTime();
 		
 		if (chat.mChatStyle == CHAT_STYLE_IRC)
 		{
@@ -173,7 +195,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 				append_style_params.font.style = "ITALIC";
 				LLChat add_chat=chat;
 				add_chat.mText = chat.mFromName + " ";
-				mChatHistory->appendMessage(add_chat, false, append_style_params);
+				mChatHistory->appendMessage(add_chat, use_plain_text_chat_history, append_style_params);
 			}
 			
 			message = message.substr(3);
@@ -182,7 +204,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)
 		}
 		else
 		{
-			mChatHistory->appendMessage(chat);
+			mChatHistory->appendMessage(chat,use_plain_text_chat_history);
 		}
 	}
 }
@@ -206,13 +228,23 @@ bool	LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
 	return false;
 }
 
-void	LLNearbyChat::onOpen(const LLSD& key )
+void	LLNearbyChat::setVisible(BOOL visible)
 {
-	LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
-	if(chat_channel)
+	if(visible)
 	{
-		chat_channel->removeToastsFromChannel();
+		LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+		if(chat_channel)
+		{
+			chat_channel->removeToastsFromChannel();
+		}
 	}
+
+	LLDockableFloater::setVisible(visible);
+}
+
+void	LLNearbyChat::onOpen(const LLSD& key )
+{
+	LLDockableFloater::onOpen(key);
 }
 
 void LLNearbyChat::setRect	(const LLRect &rect)
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 561c2d3677699f16b2c272d933cc0c1d2cc51b92..efcaf4263b1c225a132b4e0885e63a5e80dfdc62 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -53,6 +53,8 @@ class LLNearbyChat: public LLDockableFloater
 
 	/*virtual*/ void	onOpen	(const LLSD& key);
 
+	/*virtual*/ void	setVisible(BOOL visible);
+
 	virtual void setRect		(const LLRect &rect);
 
 private:
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 74a75d036959ec634e353796b94e8b886519bd1b..b0b6db682ca3ae36b541ac7a2461b4cc98206908 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -52,8 +52,6 @@ using namespace LLNotificationsUI;
 LLToastPanelBase* createToastPanel()
 {
 	LLNearbyChatToastPanel* item = LLNearbyChatToastPanel::createInstance();
-	static S32 chat_item_width = 304;
-	item->setWidth(chat_item_width);
 	return item;
 }
 
@@ -169,6 +167,29 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
 	//look in pool. if there is any message
 	if(mStopProcessing)
 		return;
+
+	/*
+    find last toast and check ID
+	*/
+
+	if(m_active_toasts.size())
+	{
+		LLUUID fromID = notification["from_id"].asUUID();		// agent id or object id
+		LLToast* toast = m_active_toasts[0];
+		LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel());
+
+		if(panel && panel->messageID() == fromID && panel->canAddText())
+		{
+			panel->addMessage(notification);
+			toast->reshapeToPanel();
+			toast->resetTimer();
+	
+			arrangeToasts();
+			return;
+		}
+	}
+	
+
 	
 	if(m_toast_pool.empty())
 	{
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 5c11bc7310a3c64db6aae4c6369e3878d71200ce..c3df4cbaf49359c4c4774a0c0a647028cba8869d 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -34,6 +34,8 @@
 #include "llviewerprecompiledheaders.h" // must be first include
 
 #include "llnotificationhandler.h"
+
+#include "llnotifications.h"
 #include "lltoastnotifypanel.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index b7466ec6d4f199e8a72b3b642e2a8d53dff0ebed..68899319563eac76edc3a7a47e5868ecb3f675c4 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -38,6 +38,7 @@
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 #include "llnotificationmanager.h"
+#include "llnotifications.h"
 
 using namespace LLNotificationsUI;
 
@@ -87,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
+		LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+
 		LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
 		LLToast::Params p;
 		p.notif_id = notification->getID();
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 42cc7cacc238e5e38a6c8619e3f2973981e1ca30..da8928321aba50b3daa5cc9e06040f6372a48496 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -36,9 +36,10 @@
 
 #include "llwindow.h"
 
-#include "llnotifications.h"
+//#include "llnotificationsutil.h"
 #include "llchannelmanager.h"
 #include "llchat.h"
+#include "llnotificationptr.h"
 
 namespace LLNotificationsUI
 {
@@ -256,6 +257,33 @@ class LLOfferHandler : public LLSysHandler
 	void onRejectToast(LLUUID& id);
 };
 
+class LLHandlerUtil
+{
+public:
+	/**
+	 * Checks sufficient conditions to log notification message to IM session.
+	 */
+	static bool canLogToIM(const LLNotificationPtr& notification);
+
+	/**
+	 * Writes notification message to IM session.
+	 */
+	static void logToIM(const EInstantMessage& session_type,
+			const std::string& session_name, const std::string& from_name,
+			const std::string& message, const LLUUID& session_owner_id,
+			const LLUUID& from_id);
+
+	/**
+	 * Writes notification message to IM  p2p session.
+	 */
+	static void logToIMP2P(const LLNotificationPtr& notification);
+
+	/**
+	 * Writes group notice notification message to IM  group session.
+	 */
+	static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+};
+
 }
 #endif
 
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..05da33851382f9bfa3d8556faa9d96facb5f65ad
--- /dev/null
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -0,0 +1,129 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Provides set of utility methods for notifications processing.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab.  Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "llnotifications.h"
+#include "llimview.h"
+#include "llagent.h"
+
+using namespace LLNotificationsUI;
+
+const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
+		REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
+				"ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
+				"ObjectGiveItemUnknownUser");
+
+// static
+bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
+{
+	return GRANTED_MODIFY_RIGHTS == notification->getName()
+			|| REVOKED_MODIFY_RIGHTS == notification->getName();
+}
+
+// static
+void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
+		const std::string& session_name, const std::string& from_name,
+		const std::string& message, const LLUUID& session_owner_id,
+		const LLUUID& from_id)
+{
+	LLUUID session_id = LLIMMgr::computeSessionID(session_type,
+			session_owner_id);
+	LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+			session_id);
+	if (session == NULL)
+	{
+		LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+	}
+	else
+	{
+		// store active session id
+		const LLUUID & active_session_id =
+				LLIMModel::instance().getActiveSessionID();
+
+		// set searched session as active to avoid IM toast popup
+		LLIMModel::instance().setActiveSessionID(session_id);
+
+		LLIMModel::instance().addMessage(session_id, from_name, from_id,
+				message);
+
+		// restore active session id
+		LLIMModel::instance().setActiveSessionID(active_session_id);
+	}
+}
+
+// static
+void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)
+{
+	const std::string
+			name =
+					notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+							: notification->getSubstitutions()["[NAME]"];
+
+	// don't create IM p2p session with objects, it's necessary condition to log
+	if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
+			!= OBJECT_GIVE_ITEM_UNKNOWN_USER)
+	{
+		LLUUID from_id = notification->getPayload()["from_id"];
+
+		logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(),
+				from_id, from_id);
+	}
+}
+
+// static
+void LLHandlerUtil::logGroupNoticeToIMGroup(
+		const LLNotificationPtr& notification)
+{
+
+	const LLSD& payload = notification->getPayload();
+	LLGroupData groupData;
+	if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
+	{
+		llwarns
+						<< "Group notice for unkown group: "
+								<< payload["group_id"].asUUID() << llendl;
+	}
+
+	const std::string group_name = groupData.mName;
+	const std::string sender_name = payload["sender_name"].asString();
+
+	// we can't retrieve sender id from group notice system message, so try to lookup it from cache
+	LLUUID sender_id;
+	gCacheName->getUUID(sender_name, sender_id);
+
+	logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"],
+			payload["group_id"], sender_id);
+}
+
diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp
index 1083cf3634be72326ebbd7d2c6b6a1471483c2fd..66bc217d1586323f8263f7379b782fd8300e7661 100644
--- a/indra/newview/llnotificationmanager.cpp
+++ b/indra/newview/llnotificationmanager.cpp
@@ -36,9 +36,11 @@
 
 
 #include "llnotificationmanager.h"
+
 #include "llnearbychathandler.h"
+#include "llnotifications.h"
 
-#include "boost/bind.hpp"
+#include <boost/bind.hpp>
 
 using namespace LLNotificationsUI;
 
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 0a595765a92f582ff62968a1c45003e708fe0c73..c179a2cf90a881f5fc086b0dc6d4d81f60594ba5 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -37,9 +37,8 @@
 #include "lltoastnotifypanel.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
-#include "llimview.h"
-#include "llimfloater.h"
 #include "llnotificationmanager.h"
+#include "llnotifications.h"
 
 using namespace LLNotificationsUI;
 
@@ -91,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
 
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		// add message to IM
-		const std::string
-				name =
-						notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
-								: notification->getSubstitutions()["[NAME]"];
-
-		// don't create IM session with objects
-		if (notification->getName() != "ObjectGiveItem"
-				&& notification->getName() != "ObjectGiveItemUnknownUser")
-		{
-			LLUUID from_id = notification->getPayload()["from_id"];
-			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
-					from_id);
-			if (!LLIMMgr::instance().hasSession(session_id))
-			{
-				session_id = LLIMMgr::instance().addSession(name,
-						IM_NOTHING_SPECIAL, from_id);
-			}
-			LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
-					notification->getMessage());
-		}
+		LLHandlerUtil::logToIMP2P(notification);
 
 		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
 
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index f01f2e44414448be4674754f9e039ab40dd9ea93..c7261199e3cee2268d570d5be410f16ba059a32f 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -38,12 +38,14 @@
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
 #include "llnotificationmanager.h"
+#include "llnotifications.h"
 #include "llscriptfloater.h"
 
 using namespace LLNotificationsUI;
 
 static const std::string SCRIPT_DIALOG				("ScriptDialog");
 static const std::string SCRIPT_DIALOG_GROUP		("ScriptDialogGroup");
+static const std::string SCRIPT_LOAD_URL			("LoadWebPage");
 
 //--------------------------------------------------------------------------
 LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
@@ -94,7 +96,12 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	
 	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
 	{
-		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+		if (LLHandlerUtil::canLogToIM(notification))
+		{
+			LLHandlerUtil::logToIMP2P(notification);
+		}
+
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
 		{
 			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
 		}
@@ -120,7 +127,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
 	}
 	else if (notify["sigtype"].asString() == "delete")
 	{
-		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
 		{
 			LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
 		}
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index b962fa218401d820afd6d1ce81c758ca9e3bc7aa..95f5ec801c454c1f382351b193cc3d450fcd8a34 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -36,6 +36,7 @@
 #include "llfloaterreg.h"
 #include "llnearbychat.h"
 #include "llnotificationhandler.h"
+#include "llnotifications.h"
 #include "lltoastnotifypanel.h"
 #include "llviewercontrol.h"
 #include "llviewerwindow.h"
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index f29a7b25a7d77e6f0ad5159102ab610afc28cebc..97c1e96175af491336a8246f68f2dd772ab07fac 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -40,6 +40,7 @@
 #include "llcombobox.h"
 #include "lldateutil.h"			// ageFromDate()
 #include "llimview.h"
+#include "llnotificationsutil.h"
 #include "lltexteditor.h"
 #include "lltexturectrl.h"
 #include "lltoggleablemenu.h"
@@ -47,6 +48,9 @@
 #include "llscrollcontainer.h"
 #include "llavatariconctrl.h"
 #include "llweb.h"
+#include "llfloaterworldmap.h"
+#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 // Class LLDropTarget
@@ -149,6 +153,8 @@ BOOL LLPanelAvatarNotes::postBuild()
 	childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);
 	childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);
 	childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL);
+	childSetCommitCallback("show_on_map_btn", (boost::bind(
+				&LLPanelAvatarNotes::onMapButtonClick, this)), NULL);
 
 	LLTextEditor* te = getChild<LLTextEditor>("notes_edit");
 	te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this));
@@ -194,6 +200,46 @@ void LLPanelAvatarNotes::onCommitNotes()
 	LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);
 }
 
+void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
+		const LLSD& response, S32 rights)
+{
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+	if (option == 0)
+	{
+		LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
+				getAvatarId(), rights);
+	}
+	else
+	{
+		childSetValue("objects_check",
+				childGetValue("objects_check").asBoolean() ? FALSE : TRUE);
+	}
+}
+
+void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
+{
+	std::string first, last;
+	LLSD args;
+	if (gCacheName->getName(getAvatarId(), first, last))
+	{
+		args["FIRST_NAME"] = first;
+		args["LAST_NAME"] = last;
+	}
+
+	if (grant)
+	{
+		LLNotificationsUtil::add("GrantModifyRights", args, LLSD(),
+				boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+						_1, _2, rights));
+	}
+	else
+	{
+		LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
+				boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+						_1, _2, rights));
+	}
+}
+
 void LLPanelAvatarNotes::onCommitRights()
 {
 	S32 rights = 0;
@@ -205,7 +251,14 @@ void LLPanelAvatarNotes::onCommitRights()
 	if(childGetValue("objects_check").asBoolean())
 		rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
 
-	LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights);
+	const LLRelationship* buddy_relationship =
+			LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+	bool allow_modify_objects = childGetValue("objects_check").asBoolean();
+	if (buddy_relationship->isRightGrantedTo(
+			LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
+	{
+		confirmModifyRights(allow_modify_objects, rights);
+	}
 }
 
 void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
@@ -310,6 +363,7 @@ void LLPanelProfileTab::onOpen(const LLSD& key)
 	// Update data even if we are viewing same avatar profile as some data might been changed.
 	setAvatarId(key.asUUID());
 	updateData();
+	updateButtons();
 }
 
 void LLPanelProfileTab::scrollToTop()
@@ -319,6 +373,22 @@ void LLPanelProfileTab::scrollToTop()
 		scrollContainer->goToTop();
 }
 
+void LLPanelProfileTab::onMapButtonClick()
+{
+	std::string name;
+	gCacheName->getFullName(getAvatarId(), name);
+	gFloaterWorldMap->trackAvatar(getAvatarId(), name);
+	LLFloaterReg::showInstance("world_map");
+}
+
+void LLPanelProfileTab::updateButtons()
+{
+	bool enable_map_btn = LLAvatarTracker::instance().isBuddyOnline(getAvatarId())
+					&& gAgent.isGodlike() || is_agent_mappable(getAvatarId());
+
+	childSetEnabled("show_on_map_btn", enable_map_btn);
+}
+
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////
@@ -337,6 +407,8 @@ BOOL LLPanelAvatarProfile::postBuild()
 	childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
 	childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
 	childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
+	childSetCommitCallback("show_on_map_btn", (boost::bind(
+			&LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
 
 	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
 	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this));
@@ -684,7 +756,7 @@ void LLPanelMyProfile::onStatusChanged()
 	{
 		gAgent.clearAFK();
 		gAgent.setBusy();
-		LLNotifications::instance().add("BusyModeSet");
+		LLNotificationsUtil::add("BusyModeSet");
 	}
 }
 
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 527e1c0d340cbf714f51d9fe977bc174b2499509..f54aeee4ebd46e55cdff07349e3f45776f4d17d3 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -106,6 +106,10 @@ class LLPanelProfileTab
 	 */
 	void scrollToTop();
 
+	virtual void onMapButtonClick();
+
+	virtual void updateButtons();
+
 private:
 
 	LLUUID mAvatarId;
@@ -256,6 +260,9 @@ class LLPanelAvatarNotes
 	 */
 	void fillRightsData();
 
+	void rightsConfirmationCallback(const LLSD& notification,
+			const LLSD& response, S32 rights);
+	void confirmModifyRights(bool grant, S32 rights);
 	void onCommitRights();
 	void onCommitNotes();
 
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 60d0f072855cec248291f235967ea89255769d5d..73cffaa7ed85af84b0e03c606cbce6956c43ae59 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -32,12 +32,14 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llpanelblockedlist.h"
+
+// library include
 #include "llfloater.h"
 #include "llfloaterreg.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistctrl.h"
 
-#include "llpanelblockedlist.h"
-
 // project include
 #include "llfloateravatarpicker.h"
 #include "llsidetray.h"
@@ -199,7 +201,7 @@ void LLPanelBlockedList::callbackBlockByName(const std::string& text)
 	BOOL success = LLMuteList::getInstance()->add(mute);
 	if (!success)
 	{
-		LLNotifications::instance().add("MuteByNameFailed");
+		LLNotificationsUtil::add("MuteByNameFailed");
 	}
 }
 
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 67a270450132b67f48dc7ffebc2d1e66b90cdf3d..70d92442ad6e69c1eb46bfdac10c16e8212829b0 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -41,6 +41,8 @@
 #include "lldir.h"
 #include "lldispatcher.h"
 #include "llfloaterreg.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "lltabcontainer.h"
 #include "message.h"
@@ -310,12 +312,12 @@ BOOL LLPanelClassified::titleIsValid()
 	const std::string& name = mNameEditor->getText();
 	if (name.empty())
 	{
-		LLNotifications::instance().add("BlankClassifiedName");
+		LLNotificationsUtil::add("BlankClassifiedName");
 		return FALSE;
 	}
 	if (!isalnum(name[0]))
 	{
-		LLNotifications::instance().add("ClassifiedMustBeAlphanumeric");
+		LLNotificationsUtil::add("ClassifiedMustBeAlphanumeric");
 		return FALSE;
 	}
 
@@ -334,7 +336,7 @@ void LLPanelClassified::apply()
 
 bool LLPanelClassified::saveCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	switch(option)
 	{
@@ -370,7 +372,7 @@ BOOL LLPanelClassified::canClose()
 
 	LLSD args;
 	args["NAME"] = mNameEditor->getText();
-	LLNotifications::instance().add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2));
+	LLNotificationsUtil::add("ClassifiedSave", args, LLSD(), boost::bind(&LLPanelClassified::saveCallback, this, _1, _2));
 	return FALSE;
 }
 
@@ -795,7 +797,7 @@ void LLPanelClassified::onClickUpdate(void* data)
 	if(self->mMatureCombo->getCurrentIndex() == DECLINE_TO_STATE)
 	{
 		// Tell user about it
-		LLNotifications::instance().add("SetClassifiedMature", 
+		LLNotificationsUtil::add("SetClassifiedMature", 
 				LLSD(), 
 				LLSD(), 
 				boost::bind(&LLPanelClassified::confirmMature, self, _1, _2));
@@ -809,7 +811,7 @@ void LLPanelClassified::onClickUpdate(void* data)
 // Callback from a dialog indicating response to mature notification
 bool LLPanelClassified::confirmMature(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	
 	// 0 == Yes
 	// 1 == No
@@ -864,7 +866,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,
 		std::string price_text = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
 		args["MIN_PRICE"] = price_text;
 			
-		LLNotifications::instance().add("MinClassifiedPrice", args);
+		LLNotificationsUtil::add("MinClassifiedPrice", args);
 		return;
 	}
 
@@ -874,7 +876,7 @@ void LLPanelClassified::callbackGotPriceForListing(S32 option, std::string text,
 
 	LLSD args;
 	args["AMOUNT"] = llformat("%d", price_for_listing);
-	LLNotifications::instance().add("PublishClassified", args, LLSD(), 
+	LLNotificationsUtil::add("PublishClassified", args, LLSD(), 
 									boost::bind(&LLPanelClassified::confirmPublish, self, _1, _2));
 }
 
@@ -901,7 +903,7 @@ void LLPanelClassified::resetDirty()
 // invoked from callbackConfirmPublish
 bool LLPanelClassified::confirmPublish(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	// Option 0 = publish
 	if (option != 0) return false;
 
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 61f23961687240f51727093fef94c52036174b38..2cb3967685efe2b561e77774ddff3615fdcbb8b8 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -43,7 +43,7 @@
 #include "llviewermessage.h"
 #include "llviewerwindow.h"
 #include "llappviewer.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llfloaterreg.h"
 #include "llfloater.h"
 #include "llgroupactions.h"
@@ -245,7 +245,7 @@ void LLPanelGroup::onBtnCreate()
 	{
 		LLSD args;
 		args["MESSAGE"] = apply_mesg;
-		LLNotifications::instance().add("GenericAlert", args);
+		LLNotificationsUtil::add("GenericAlert", args);
 	}
 }
 
@@ -441,7 +441,7 @@ bool	LLPanelGroup::apply(LLPanelGroupTab* tab)
 	{
 		LLSD args;
 		args["MESSAGE"] = apply_mesg;
-		LLNotifications::instance().add("GenericAlert", args);
+		LLNotificationsUtil::add("GenericAlert", args);
 	}
 	return false;
 }
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index a1d54367c983910b595b521e01d07eb98bae4208..31dfdde887c1841590ca4eb49687062dd053c6e7 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -48,6 +48,7 @@
 #include "lllineeditor.h"
 #include "llnamebox.h"
 #include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistitem.h"
 #include "llspinctrl.h"
 #include "lltextbox.h"
@@ -360,7 +361,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
 		if(mComboMature &&
 		   mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
 		{
-			LLNotifications::instance().add("SetGroupMature", LLSD(), LLSD(), 
+			LLNotificationsUtil::add("SetGroupMature", LLSD(), LLSD(), 
 											boost::bind(&LLPanelGroupGeneral::confirmMatureApply, this, _1, _2));
 			return false;
 		}
@@ -379,7 +380,7 @@ bool LLPanelGroupGeneral::apply(std::string& mesg)
 				return false;
 			}
 
-			LLNotifications::instance().add("CreateGroupCost",  LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
+			LLNotificationsUtil::add("CreateGroupCost",  LLSD(), LLSD(), boost::bind(&LLPanelGroupGeneral::createGroupCallback, this, _1, _2));
 
 			return false;
 		}
@@ -459,7 +460,7 @@ void LLPanelGroupGeneral::cancel()
 // invoked from callbackConfirmMature
 bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	// 0 == Yes
 	// 1 == No
 	// 2 == Cancel
@@ -482,7 +483,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
 	{
 		LLSD args;
 		args["MESSAGE"] = mesg;
-		LLNotifications::instance().add("GenericAlert", args);
+		LLNotificationsUtil::add("GenericAlert", args);
 	}
 
 	return ret;
@@ -491,7 +492,7 @@ bool LLPanelGroupGeneral::confirmMatureApply(const LLSD& notification, const LLS
 // static
 bool LLPanelGroupGeneral::createGroupCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index c5eaa3420402f4198d1192a0c48694574a0ef2a2..375ee0fdc41f4c27e1ff84ce34656db6686e3ed0 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -40,6 +40,7 @@
 #include "llgroupactions.h"
 #include "llgroupmgr.h"
 #include "llnamelistctrl.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistitem.h"
 #include "llspinctrl.h"
 #include "lltextbox.h"
@@ -164,7 +165,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
 		{
 			LLSD args;
 			args["MESSAGE"] = mOwnerWarning;
-			LLNotifications::instance().add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2));
+			LLNotificationsUtil::add("GenericAlertYesCancel", args, LLSD(), boost::bind(&LLPanelGroupInvite::impl::inviteOwnerCallback, this, _1, _2));
 			return; // we'll be called again if user confirms
 		}
 	}
@@ -190,7 +191,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
 	{
 		LLSD msg;
 		msg["MESSAGE"] = mAlreadyInGroup;
-		LLNotifications::instance().add("GenericAlert", msg);
+		LLNotificationsUtil::add("GenericAlert", msg);
 	}
 
 	//then close
@@ -199,7 +200,7 @@ void LLPanelGroupInvite::impl::submitInvitations()
 
 bool LLPanelGroupInvite::impl::inviteOwnerCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	switch(option)
 	{
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 22138a81ecace0c160ba0c0a37c1fab89170f2e0..e04c8300368d16bbf7712f2553ea1c469bebb2a2 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -58,7 +58,7 @@
 #include "roles_constants.h"
 #include "llviewerwindow.h"
 #include "llviewermessage.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices");
 
@@ -372,7 +372,7 @@ void LLPanelGroupNotices::onClickSendMessage(void* data)
 	if (self->mCreateSubject->getText().empty())
 	{
 		// Must supply a subject
-		LLNotifications::instance().add("MustSpecifyGroupNoticeSubject");
+		LLNotificationsUtil::add("MustSpecifyGroupNoticeSubject");
 		return;
 	}
 	send_group_notice(
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 7b5b232ad23e18ed911ece5b825ddbbae31afab3..b6c58808ae12dfbc86b61efcb899d385ab57ff99 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,6 +42,8 @@
 #include "lliconctrl.h"
 #include "lllineeditor.h"
 #include "llnamelistctrl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llpanelgrouproles.h"
 #include "llscrolllistctrl.h"
@@ -231,7 +233,7 @@ BOOL LLPanelGroupRoles::attemptTransition()
 		LLSD args;
 		args["NEEDS_APPLY_MESSAGE"] = mesg;
 		args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
-		LLNotifications::instance().add("PanelGroupApply", args, LLSD(),
+		LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),
 			boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));
 		mHasModal = TRUE;
 		// We need to reselect the current tab, since it isn't finished.
@@ -275,7 +277,7 @@ void LLPanelGroupRoles::transitionToTab()
 
 bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	mHasModal = FALSE;
 	switch (option)
 	{
@@ -291,7 +293,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
 				mHasModal = TRUE;
 				LLSD args;
 				args["MESSAGE"] = apply_mesg;
-				LLNotifications::instance().add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2));
+				LLNotificationsUtil::add("GenericAlert", args, LLSD(), boost::bind(&LLPanelGroupRoles::onModalClose, this, _1, _2));
 			}
 			// Skip switching tabs.
 			break;
@@ -1100,10 +1102,33 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
 
 	mMembersList->deleteSelectedItems();
 
+	sendEjectNotifications(mGroupID, selected_members);
+
 	LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID,
 									 selected_members);
 }
 
+void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members)
+{
+	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
+
+	if (group_data)
+	{
+		for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i)
+		{
+			LLSD args;
+			std::string name;
+			
+			gCacheName->getFullName(*i, name);
+
+			args["AVATAR_NAME"] = name;
+			args["GROUP_NAME"] = group_data->mName;
+			
+			LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+		}
+	}
+}
+
 void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
 												LLRoleMemberChangeType type)
 {
@@ -1279,7 +1304,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)
 			{
 				mHasModal = TRUE;
 				args["ROLE_NAME"] = rd.mRoleName;
-				LLNotifications::instance().add("AddGroupOwnerWarning",
+				LLNotificationsUtil::add("AddGroupOwnerWarning",
 										args,
 										LLSD(),
 										boost::bind(&LLPanelGroupMembersSubTab::addOwnerCB, this, _1, _2));
@@ -1304,7 +1329,7 @@ bool LLPanelGroupMembersSubTab::apply(std::string& mesg)
 
 bool LLPanelGroupMembersSubTab::addOwnerCB(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	mHasModal = FALSE;
 
 	if (0 == option)
@@ -1543,9 +1568,6 @@ void LLPanelGroupMembersSubTab::updateMembers()
 	mPendingMemberUpdate = FALSE;
 
 	// Rebuild the members list.
-	mMembersList->deleteAllItems();
-
-	lldebugs << "LLPanelGroupMembersSubTab::updateMembers()" << llendl;
 
 	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
 	if (!gdatap) 
@@ -1562,7 +1584,12 @@ void LLPanelGroupMembersSubTab::updateMembers()
 	{
 		return;
 	}
-		
+
+	//cleanup list only for first iretation
+	if(mMemberProgress == gdatap->mMembers.begin())
+		mMembersList->deleteAllItems();
+
+
 	LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
 
 	S32 i = 0;
@@ -2126,7 +2153,7 @@ void LLPanelGroupRolesSubTab::handleActionCheck(LLUICtrl* ctrl, bool force)
 				{
 					warning = "AssignDangerousAbilityWarning";
 				}
-				LLNotifications::instance().add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
+				LLNotificationsUtil::add(warning, args, LLSD(), boost::bind(&LLPanelGroupRolesSubTab::addActionCB, this, _1, _2, check));
 			}
 			else
 			{
@@ -2154,7 +2181,7 @@ bool LLPanelGroupRolesSubTab::addActionCB(const LLSD& notification, const LLSD&
 
 	mHasModal = FALSE;
 
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		// User clicked "Yes"
@@ -2300,7 +2327,7 @@ void LLPanelGroupRolesSubTab::handleDeleteRole()
 	{
 		LLSD args;
 		args["MESSAGE"] = mRemoveEveryoneTxt;
-		LLNotifications::instance().add("GenericAlert", args);
+		LLNotificationsUtil::add("GenericAlert", args);
 		return;
 	}
 
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index b6e2245e70d0fcb9e6b58f2355cbf8b4e01ff635..bb3c9096cf406b5479c2da6122697f460efdc9b8 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -170,6 +170,7 @@ class LLPanelGroupMembersSubTab : public LLPanelGroupSubTab
 
 	static void onEjectMembers(void*);
 	void handleEjectMembers();
+	void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members);
 
 	static void onRoleCheck(LLUICtrl* check, void* user_data);
 	void handleRoleCheck(const LLUUID& role_id,
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index fa6d16cfb16839689b9bf6b4412817d804efce95..405c95fc229e8374e0031a84f60748c99f07064d 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -32,6 +32,8 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llfloaterreg.h"
+
 #include "llpanelimcontrolpanel.h"
 
 #include "llagent.h"
@@ -58,7 +60,7 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()
 
 void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
 {
-	// TODO: implement Voice Control Panel opening
+	LLFloaterReg::showInstance("voice_controls");
 }
 
 void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
@@ -120,6 +122,7 @@ LLPanelIMControlPanel::LLPanelIMControlPanel()
 
 LLPanelIMControlPanel::~LLPanelIMControlPanel()
 {
+	LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
 }
 
 BOOL LLPanelIMControlPanel::postBuild()
@@ -169,7 +172,9 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 
 	LLIMModel& im_model = LLIMModel::instance();
 
+	LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
 	mAvatarID = im_model.getOtherParticipantID(session_id);
+	LLAvatarTracker::instance().addParticularFriendObserver(mAvatarID, this);
 
 	// Disable "Add friend" button for friends.
 	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
@@ -198,6 +203,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
 	}
 }
 
+//virtual
+void LLPanelIMControlPanel::changed(U32 mask)
+{
+	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
+}
+
 void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
 {
 	if ( id == mAvatarID )
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 7bfc432ef2feee098849674baae2b3401c9ac3da..a590232a0b39db4dcb97cd232248f010e13793b6 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -35,6 +35,7 @@
 
 #include "llpanel.h"
 #include "llvoicechannel.h"
+#include "llcallingcard.h"
 
 class LLSpeakerMgr;
 class LLAvatarList;
@@ -66,7 +67,7 @@ class LLPanelChatControlPanel : public LLPanel
 };
 
 
-class LLPanelIMControlPanel : public LLPanelChatControlPanel
+class LLPanelIMControlPanel : public LLPanelChatControlPanel, LLFriendObserver
 {
 public:
 	LLPanelIMControlPanel();
@@ -76,6 +77,9 @@ class LLPanelIMControlPanel : public LLPanelChatControlPanel
 
 	void setSessionId(const LLUUID& session_id);
 
+	// LLFriendObserver trigger
+	virtual void changed(U32 mask);
+
 protected:
 	void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
 
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 003241e98ebfe17c023bd0a78fda8585312e7a05..413d8ed7567ec6ad678f8ea395f5a7dc409cb18a 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -746,13 +746,14 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
 	{
 		return canSelectedBeModified(command_name);
 	}
-	else if ( "sort_by_date" == command_name)
-	{
-		return  mSortByDate;
-	}
 	else if("create_pick" == command_name)
 	{
-		return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
+		std::set<LLUUID> selection;
+		if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) )
+		{
+			return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
+		}
+		return false;
 	}
 	else
 	{
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index ec0f8e303c455a9f4ae0517bdc8c23558688031f..d2a17dbd9791e8a8839ee5a7f64a7a0bb48c48c9 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -51,6 +51,7 @@
 #include "llfloaterpreference.h"
 #include "llfocusmgr.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "llstartup.h"
 #include "lltextbox.h"
 #include "llui.h"
@@ -225,6 +226,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
 
 	LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
 
+	LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));
 	std::string sim_string = LLURLSimString::sInstance.mSimString;
 	if (!sim_string.empty())
 	{
@@ -892,14 +894,29 @@ void LLPanelLogin::onClickConnect(void *)
 		LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
 		std::string combo_text = combo->getSimple();
 		
-		if (first.empty() || last.empty())
+		bool has_first_and_last = !(first.empty() || last.empty());
+		bool has_location = false;
+
+		if(combo_text=="<Type region name>" || combo_text =="")
+		{
+			// *NOTE: Mani - Location field is not always committed by this point!
+			// This may be duplicate work, but better than not doing the work!
+			LLURLSimString::sInstance.setString("");
+		}
+		else 
+		{
+			// *NOTE: Mani - Location field is not always committed by this point!
+			LLURLSimString::sInstance.setString(combo_text);
+			has_location = true;
+		}
+
+		if(!has_first_and_last)
 		{
-			LLNotifications::instance().add("MustHaveAccountToLogIn");
+			LLNotificationsUtil::add("MustHaveAccountToLogIn");
 		}
-		else if( (combo_text=="<Type region name>" || combo_text =="")
-				&& LLURLSimString::sInstance.mSimString =="")
+		else if(!has_location)
 		{
-			LLNotifications::instance().add("StartRegionEmpty");
+			LLNotificationsUtil::add("StartRegionEmpty");
 		}
 		else
 		{
@@ -913,7 +930,7 @@ void LLPanelLogin::onClickConnect(void *)
 // static
 bool LLPanelLogin::newAccountAlertCallback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		llinfos << "Going to account creation URL" << llendl;
@@ -954,7 +971,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
 {
 	if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
 	{
-		LLNotifications::instance().add("CapsKeyOn");
+		LLNotificationsUtil::add("CapsKeyOn");
 		sCapslockDidNotification = TRUE;
 	}
 }
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index ad8a379cc1dd66bd5cd88af833196518db2d285c..b1e7dd3d502846bb71d713e695bf8476f5eb4c3e 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -32,12 +32,17 @@
 
 #include "llviewerprecompiledheaders.h"
 
-#include "llagent.h"
 #include "llpanelmediasettingsgeneral.h"
+
+// library includes
 #include "llcombobox.h"
 #include "llcheckboxctrl.h"
+#include "llnotificationsutil.h"
 #include "llspinctrl.h"
 #include "lluictrlfactory.h"
+
+// project includes
+#include "llagent.h"
 #include "llviewerwindow.h"
 #include "llviewermedia.h"
 #include "llsdutil.h"
@@ -360,7 +365,7 @@ void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdat
 	std::string home_url = self->mHomeURL->getValue().asString();
 	if ( ! self->mParent->passesWhiteList( home_url ) )
 	{
-		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");		
+		LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");		
 		return;
 	};
 	
@@ -387,17 +392,19 @@ void LLPanelMediaSettingsGeneral::preApply()
 //
 void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
 {
-    fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
-    fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
-    fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
-    fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
-    fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
-    //Don't fill in current URL: this is only supposed to get changed via navigate
+	fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
+	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
+	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
+	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
+	fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
+	//Don't fill in current URL: this is only supposed to get changed via navigate
 	// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
-    fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
-    fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
-    fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
-    fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
+	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
+	// Don't fill in the home URL if it is the special "Multiple Media" string!
+	if (LLTrans::getString("Multiple Media") != mHomeURL->getValue())
+		fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
+	fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
+	fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index 1a772e4effd45ff74d1252d4ce2130337e4d5619..7ec53ed57a800ed92b77f477b6ec89c39d226392 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -31,10 +31,13 @@
  */
 
 #include "llviewerprecompiledheaders.h"
-#include "llfloaterreg.h"
+
 #include "llpanelmediasettingssecurity.h"
+
+#include "llfloaterreg.h"
 #include "llpanelcontents.h"
 #include "llcheckboxctrl.h"
+#include "llnotificationsutil.h"
 #include "llscrolllistctrl.h"
 #include "llscrolllistitem.h"
 #include "lluictrlfactory.h"
@@ -210,7 +213,7 @@ void LLPanelMediaSettingsSecurity::preApply()
 //
 void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
 {
-    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
+    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
 
     // iterate over white list and extract items
     std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
@@ -316,7 +319,7 @@ void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
 	else
 	// display a message indicating you can't do that
 	{
-		LLNotifications::instance().add("WhiteListInvalidatesHomeUrl");
+		LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");
 	};
 }
 
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index 4237681c800f61d88791882045ad3e6da319a066..342d2bc7393e9e4059fe075a1c1e99c921908eb9 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -42,6 +42,7 @@
 #include "llpanelobjectinventory.h"
 
 #include "llmenugl.h"
+#include "llnotificationsutil.h"
 #include "roles_constants.h"
 
 #include "llagent.h"
@@ -207,7 +208,7 @@ void LLTaskInvFVBridge::buyItem()
 	LLViewerObject* obj;
 	if( ( obj = gObjectList.findObject( mPanel->getTaskUUID() ) ) && obj->isAttachment() )
 	{
-		LLNotifications::instance().add("Cannot_Purchase_an_Attachment");
+		LLNotificationsUtil::add("Cannot_Purchase_an_Attachment");
 		llinfos << "Attempt to purchase an attachment" << llendl;
 		delete inv;
 	}
@@ -219,9 +220,9 @@ void LLTaskInvFVBridge::buyItem()
         if (sale_info.getSaleType() != LLSaleInfo::FS_CONTENTS)
         {
         	U32 next_owner_mask = perm.getMaskNextOwner();
-        	args["MODIFYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
-        	args["COPYPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
-        	args["RESELLPERM"] = LLNotifications::instance().getGlobalString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
+        	args["MODIFYPERM"] = LLTrans::getString((next_owner_mask & PERM_MODIFY) ? "PermYes" : "PermNo");
+        	args["COPYPERM"] = LLTrans::getString((next_owner_mask & PERM_COPY) ? "PermYes" : "PermNo");
+        	args["RESELLPERM"] = LLTrans::getString((next_owner_mask & PERM_TRANSFER) ? "PermYes" : "PermNo");
         }
 
 		std::string alertdesc;
@@ -243,7 +244,7 @@ void LLTaskInvFVBridge::buyItem()
 		payload["task_id"] = inv->mTaskID;
 		payload["item_id"] = inv->mItemID;
 		payload["type"] = inv->mType;
-		LLNotifications::instance().add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem);
+		LLNotificationsUtil::add(alertdesc, args, payload, LLTaskInvFVBridge::commitBuyItem);
 	}
 }
 
@@ -263,7 +264,7 @@ S32 LLTaskInvFVBridge::getPrice()
 // static
 bool LLTaskInvFVBridge::commitBuyItem(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(0 == option)
 	{
 		LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
@@ -423,7 +424,7 @@ BOOL LLTaskInvFVBridge::isItemRemovable()
 
 bool remove_task_inventory_callback(const LLSD& notification, const LLSD& response, LLPanelObjectInventory* panel)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLViewerObject* object = gObjectList.findObject(notification["payload"]["task_id"].asUUID());
 	if(option == 0 && object)
 	{
@@ -468,7 +469,7 @@ BOOL LLTaskInvFVBridge::removeItem()
 				LLSD payload;
 				payload["task_id"] = mPanel->getTaskUUID();
 				payload["inventory_ids"].append(mUUID);
-				LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+				LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
 				return FALSE;
 			}
 		}
@@ -498,7 +499,7 @@ void LLTaskInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>&
 			LLTaskInvFVBridge* itemp = (LLTaskInvFVBridge*)batch[i];
 			payload["inventory_ids"].append(itemp->getUUID());
 		}
-		LLNotifications::instance().add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
+		LLNotificationsUtil::add("RemoveItemWarn", LLSD(), payload, boost::bind(&remove_task_inventory_callback, _1, _2, mPanel));
 		
 	}
 	else
@@ -1169,7 +1170,7 @@ void LLTaskLSLBridge::openItem()
 	}
 	else
 	{	
-		LLNotifications::instance().add("CannotOpenScriptObjectNoMod");
+		LLNotificationsUtil::add("CannotOpenScriptObjectNoMod");
 	}
 }
 
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index e6b6ec64bd7e2cd1147a343f481daa0ba7f84d3b..6771bb417009fc430fc091444a19689ab5a1fc09 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -73,6 +73,8 @@ static const std::string FRIENDS_TAB_NAME	= "friends_panel";
 static const std::string GROUP_TAB_NAME		= "groups_panel";
 static const std::string RECENT_TAB_NAME	= "recent_panel";
 
+static const std::string COLLAPSED_BY_USER  = "collapsed_by_user";
+
 /** Comparator for comparing avatar items by last interaction date */
 class LLAvatarItemRecentComparator : public LLAvatarItemComparator
 {
@@ -467,7 +469,7 @@ LLPanelPeople::~LLPanelPeople()
 
 }
 
-void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list)
+void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)
 {
 	if(!avatar_list)
 	{
@@ -477,6 +479,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
 
 	bool expanded = param.asBoolean();
 
+	setAccordionCollapsedByUser(ctrl, !expanded);
 	if(!expanded)
 	{
 		avatar_list->resetSelection();
@@ -550,11 +553,11 @@ BOOL LLPanelPeople::postBuild()
 
 	LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
 	accordion_tab->setDropDownStateChangedCallback(
-		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mAllFriendList));
+		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));
 
 	accordion_tab = getChild<LLAccordionCtrlTab>("tab_online");
 	accordion_tab->setDropDownStateChangedCallback(
-		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));
+		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));
 
 	buttonSetAction("view_profile_btn",	boost::bind(&LLPanelPeople::onViewProfileButtonClicked,	this));
 	buttonSetAction("group_info_btn",	boost::bind(&LLPanelPeople::onGroupInfoButtonClicked,	this));
@@ -760,7 +763,13 @@ void LLPanelPeople::updateButtons()
 
 		LLPanel* cur_panel = mTabContainer->getCurrentPanel();
 		if (cur_panel)
+		{
 			cur_panel->childSetEnabled("add_friend_btn", !is_friend);
+			if (friends_tab_active)
+			{
+				cur_panel->childSetEnabled("del_btn", multiple_selected);
+			}
+		}
 	}
 
 	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
@@ -931,6 +940,9 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
 	mRecentList->setNameFilter(mFilterSubString);
 	mGroupList->setNameFilter(mFilterSubString);
 
+	setAccordionCollapsedByUser("tab_online", false);
+	setAccordionCollapsedByUser("tab_all", false);
+
 	showFriendsAccordionsIfNeeded();
 }
 
@@ -1309,8 +1321,12 @@ void LLPanelPeople::showAccordion(const std::string name, bool show)
 	tab->setVisible(show);
 	if(show)
 	{
-		// expand accordion
-		tab->changeOpenClose(false);
+		// don't expand accordion if it was collapsed by user
+		if(!isAccordionCollapsedByUser(tab))
+		{
+			// expand accordion
+			tab->changeOpenClose(false);
+		}
 	}
 }
 
@@ -1342,3 +1358,44 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param
 	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
 	accordion->arrange();
 }
+
+void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+	if(!acc_tab)
+	{
+		llwarns << "Invalid parameter" << llendl;
+		return;
+	}
+
+	LLSD param = acc_tab->getValue();
+	param[COLLAPSED_BY_USER] = collapsed;
+	acc_tab->setValue(param);
+}
+
+void LLPanelPeople::setAccordionCollapsedByUser(const std::string& name, bool collapsed)
+{
+	setAccordionCollapsedByUser(getChild<LLUICtrl>(name), collapsed);
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+	if(!acc_tab)
+	{
+		llwarns << "Invalid parameter" << llendl;
+		return false;
+	}
+
+	LLSD param = acc_tab->getValue();
+	if(!param.has(COLLAPSED_BY_USER))
+	{
+		return false;
+	}
+	return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
+{
+	return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
+}
+
+// EOF
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index d9dd76f3acd9645e341dc26c61a6ec454bbb3a28..5ac5bcc1d7e3ff5041d213eb6781b83c8f52f3fd 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -127,7 +127,7 @@ class LLPanelPeople : public LLPanel
 								const std::vector<LLUUID>& ids,
 								void*);
 
-	void					onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list);
+	void					onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
 
 	void					showAccordion(const std::string name, bool show);
 
@@ -135,6 +135,11 @@ class LLPanelPeople : public LLPanel
 
 	void					onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
 
+	void					setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+	void					setAccordionCollapsedByUser(const std::string& name, bool collapsed);
+	bool					isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+	bool					isAccordionCollapsedByUser(const std::string& name);
+
 	LLFilterEditor*			mFilterEditor;
 	LLTabContainer*			mTabContainer;
 	LLAvatarList*			mOnlineFriendList;
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index d8e0d91d885dc05f20d1d8723202ac10c549ddad..6a29d76aad4f84160f85a6d69f034f880f6c9cfd 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -36,13 +36,16 @@
 
 #include "llpanelpermissions.h"
 
+// library includes
 #include "lluuid.h"
 #include "llpermissions.h"
 #include "llcategory.h"
 #include "llclickaction.h"
 #include "llfocusmgr.h"
+#include "llnotificationsutil.h"
 #include "llstring.h"
 
+// project includes
 #include "llviewerwindow.h"
 #include "llresmgr.h"
 #include "lltextbox.h"
@@ -891,7 +894,7 @@ void LLPanelPermissions::cbGroupID(LLUUID group_id)
 
 bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LLUUID group_id;
@@ -907,7 +910,7 @@ bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
 
 void LLPanelPermissions::onClickDeedToGroup(void* data)
 {
-	LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
+	LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
 }
 
 ///----------------------------------------------------------------------------
@@ -1084,7 +1087,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 		LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
 		if (!sale_info.isForSale())
 		{
-			LLNotifications::instance().add("CantSetBuyObject");
+			LLNotificationsUtil::add("CantSetBuyObject");
 
 			// Set click action back to its old value
 			U8 click_action = 0;
@@ -1102,7 +1105,7 @@ void LLPanelPermissions::onCommitClickAction(LLUICtrl* ctrl, void*)
 		if (!can_pay)
 		{
 			// Warn, but do it anyway.
-			LLNotifications::instance().add("ClickActionNotPayable");
+			LLNotificationsUtil::add("ClickActionNotPayable");
 		}
 	}
 	LLSelectMgr::getInstance()->selectionSetClickAction(click_action);
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 10b90b08d76b7b4eec62e2d207423ea14e8e7802..4abb60ddeda8e54b3259ec5116fd83a32f95fcd0 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -32,12 +32,15 @@
 
 #include "llviewerprecompiledheaders.h"
 
+#include "llpanelpicks.h"
+
 #include "llagent.h"
 #include "llagentpicksinfo.h"
 #include "llavatarconstants.h"
 #include "llflatlistview.h"
 #include "llfloaterreg.h"
 #include "llfloaterworldmap.h"
+#include "llnotificationsutil.h"
 #include "lltexturectrl.h"
 #include "lltoggleablemenu.h"
 #include "llviewergenericmessage.h"	// send_generic_message
@@ -47,7 +50,6 @@
 
 #include "llaccordionctrl.h"
 #include "llaccordionctrltab.h"
-#include "llpanelpicks.h"
 #include "llavatarpropertiesprocessor.h"
 #include "llpanelavatar.h"
 #include "llpanelprofile.h"
@@ -431,7 +433,7 @@ void LLPanelPicks::onClickDelete()
 	{
 		LLSD args; 
 		args["PICK"] = value[PICK_NAME]; 
-		LLNotifications::instance().add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2)); 
+		LLNotificationsUtil::add("DeleteAvatarPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeletePick, this, _1, _2)); 
 		return;
 	}
 
@@ -440,14 +442,14 @@ void LLPanelPicks::onClickDelete()
 	{
 		LLSD args; 
 		args["NAME"] = value[CLASSIFIED_NAME]; 
-		LLNotifications::instance().add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2)); 
+		LLNotificationsUtil::add("DeleteClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackDeleteClassified, this, _1, _2)); 
 		return;
 	}
 }
 
 bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& response) 
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLSD pick_value = mPicksList->getSelectedValue();
 
 	if (0 == option)
@@ -461,7 +463,7 @@ bool LLPanelPicks::callbackDeletePick(const LLSD& notification, const LLSD& resp
 
 bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD& response) 
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLSD value = mClassifiedsList->getSelectedValue();
 
 	if (0 == option)
@@ -475,7 +477,7 @@ bool LLPanelPicks::callbackDeleteClassified(const LLSD& notification, const LLSD
 
 bool LLPanelPicks::callbackTeleport( const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (0 == option)
 	{
@@ -540,7 +542,7 @@ void LLPanelPicks::onDoubleClickPickItem(LLUICtrl* item)
 	
 	LLSD args; 
 	args["PICK"] = pick_value[PICK_NAME]; 
-	LLNotifications::instance().add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
+	LLNotificationsUtil::add("TeleportToPick", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
 }
 
 void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item)
@@ -550,7 +552,7 @@ void LLPanelPicks::onDoubleClickClassifiedItem(LLUICtrl* item)
 
 	LLSD args; 
 	args["CLASSIFIED"] = value[CLASSIFIED_NAME]; 
-	LLNotifications::instance().add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
+	LLNotificationsUtil::add("TeleportToClassified", args, LLSD(), boost::bind(&LLPanelPicks::callbackTeleport, this, _1, _2)); 
 }
 
 void LLPanelPicks::updateButtons()
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index b17b6d6fe94d3a12fb286f23dde7314f70edb696..b21b1c64b144ec3fe8e0eb44a8d0af480a26e0f2 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -86,6 +86,9 @@ class LLPanelPicks
 	// parent panels failed to work (picks related code was in my profile panel)
 	void setProfilePanel(LLPanelProfile* profile_panel);
 
+protected:
+	/*virtual*/void updateButtons();
+
 private:
 	void onClickDelete();
 	void onClickTeleport();
@@ -125,7 +128,6 @@ class LLPanelPicks
 	bool callbackDeleteClassified(const LLSD& notification, const LLSD& response);
 	bool callbackTeleport(const LLSD& notification, const LLSD& response);
 
-	void updateButtons();
 
 	virtual void onDoubleClickPickItem(LLUICtrl* item);
 	virtual void onDoubleClickClassifiedItem(LLUICtrl* item);
diff --git a/indra/newview/llpanelplace.cpp b/indra/newview/llpanelplace.cpp
index 61e18195b83e700d0feeece8ddc9d3ea32b62b75..71d763b562062c6a9449738177ab5d8b2146fcc9 100644
--- a/indra/newview/llpanelplace.cpp
+++ b/indra/newview/llpanelplace.cpp
@@ -46,6 +46,7 @@
 #include "llbutton.h"
 #include "llfloaterworldmap.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "lluiconstants.h"
 #include "lltextbox.h"
 #include "lltexteditor.h"
@@ -401,13 +402,13 @@ void LLPanelPlace::onClickAuction(void* data)
 	LLSD args;
 	args["AUCTION_ID"] = self->mAuctionID;
 
-	LLNotifications::instance().add("GoToAuctionPage", args);
+	LLNotificationsUtil::add("GoToAuctionPage", args);
 }
 /*
 // static
 bool LLPanelPlace::callbackAuctionWebPage(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		std::string url;
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 257a21ca1510e47217c5ee52fdbbe0aea0992010..839b2ec45e8d35844399c7a53803d4d670b05942 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -43,7 +43,7 @@
 #include "llcombobox.h"
 #include "llfiltereditor.h"
 #include "llfloaterreg.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "lltabcontainer.h"
 #include "lltexteditor.h"
 #include "lltrans.h"
@@ -417,7 +417,7 @@ void LLPanelPlaces::onTeleportButtonClicked()
 		{
 			LLSD payload;
 			payload["asset_id"] = mItem->getAssetUUID();
-			LLNotifications::instance().add("TeleportFromLandmark", LLSD(), payload);
+			LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
 		}
 		else if (mPlaceInfoType == AGENT_INFO_TYPE ||
 				 mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
@@ -906,5 +906,5 @@ static void onSLURLBuilt(std::string& slurl)
 	LLSD args;
 	args["SLURL"] = slurl;
 
-	LLNotifications::instance().add("CopySLURL", args);
+	LLNotificationsUtil::add("CopySLURL", args);
 }
diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp
index 42c871a41aa146ec6a1be880eb9ad502a139d910..b7669fd63d689f6b8dbacdd970f9c5f77db40aa4 100644
--- a/indra/newview/llpanelplacestab.cpp
+++ b/indra/newview/llpanelplacestab.cpp
@@ -35,7 +35,7 @@
 
 #include "llwindow.h"
 
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 #include "llbutton.h"
 #include "llslurl.h"
@@ -82,5 +82,5 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
 	LLSD args;
 	args["SLURL"] = sl_url;
 
-	LLNotifications::instance().add("CopySLURL", args);
+	LLNotificationsUtil::add("CopySLURL", args);
 }
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 529912929d6274699058686226d411b07c0d4a8e..e86123d56517eb95b05240dab8505d19f2eca543 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -66,10 +66,6 @@
 glh::matrix4f glh_get_current_modelview();
 glh::matrix4f glh_get_current_projection();
 
-const F32 ZOOM_NEAR_PADDING		= 1.0f;
-const F32 ZOOM_MEDIUM_PADDING	= 1.15f;
-const F32 ZOOM_FAR_PADDING		= 1.5f;
-
 // Warning: make sure these two match!
 const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
 const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
@@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
 	mUpdateSlider(true),
 	mClearFaceOnFade(false),
 	mCurrentRate(0.0),
-	mMovieDuration(0.0)
+	mMovieDuration(0.0),
+	mTargetObjectID(LLUUID::null),
+	mTargetObjectFace(0),
+	mTargetImplID(LLUUID::null),
+	mTargetObjectNormal(LLVector3::zero),
+	mZoomObjectID(LLUUID::null),
+	mZoomObjectFace(0)
 {
 	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
 	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild()
 	mRightBookend			= getChild<LLUICtrl>("right_bookend");
 	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));
 	LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
+	LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
+	LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
+	LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
+	LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
+	LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
 
 	// These are currently removed...but getChild creates a "dummy" widget.
 	// This class handles them missing.
@@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
 
 void LLPanelPrimMediaControls::updateShape()
 {
-	const S32 MIN_HUD_WIDTH=400;
-	const S32 MIN_HUD_HEIGHT=120;
-
 	LLViewerMediaImpl* media_impl = getTargetMediaImpl();
 	LLViewerObject* objectp = getTargetObject();
 	
@@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()
 
 	bool can_navigate = parcel->getMediaAllowNavigate();
 	bool enabled = false;
-	bool is_zoomed = (mCurrentZoom != ZOOM_NONE);
+	bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
 	// There is no such thing as "has_focus" being different from normal controls set
 	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'
 	// to 'true' (or, actually, we use a setting)
@@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape()
 		mStopCtrl->setVisible(false);
 		mHomeCtrl->setVisible(has_focus);
 		mZoomCtrl->setVisible(!is_zoomed);
-		mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+		mUnzoomCtrl->setVisible(is_zoomed);
 		mOpenCtrl->setVisible(true);
 		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
 		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape()
 
 		if(media_plugin && media_plugin->pluginSupportsMediaTime())
 		{
-			mReloadCtrl->setEnabled(FALSE);
-			mReloadCtrl->setVisible(FALSE);
+			mReloadCtrl->setEnabled(false);
+			mReloadCtrl->setVisible(false);
 			mMediaStopCtrl->setVisible(has_focus);
-			mHomeCtrl->setVisible(FALSE);
-			// No nav controls
-			mBackCtrl->setVisible(FALSE);
-			mFwdCtrl->setEnabled(FALSE);
+			mHomeCtrl->setVisible(has_focus);
+			mBackCtrl->setVisible(false);
+			mFwdCtrl->setVisible(false);
 			mMediaAddressCtrl->setVisible(false);
 			mMediaAddressCtrl->setEnabled(false);
 			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape()
 					mPlayCtrl->setVisible(FALSE);
 					mPauseCtrl->setEnabled(TRUE);
 					mPauseCtrl->setVisible(has_focus);
-					mMediaStopCtrl->setEnabled(TRUE);
 					
 					break;
 				case LLPluginClassMediaOwner::MEDIA_PAUSED:
@@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape()
 					mPauseCtrl->setVisible(FALSE);
 					mPlayCtrl->setEnabled(TRUE);
 					mPlayCtrl->setVisible(has_focus);
-					mMediaStopCtrl->setEnabled(FALSE);
 					break;
 			}
 		}
@@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape()
 			{	
 				mMediaProgressPanel->setVisible(true);
 				mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
-				gFocusMgr.setTopCtrl(mMediaProgressPanel);
 			}
 			else
 			{
 				mMediaProgressPanel->setVisible(false);
-				gFocusMgr.setTopCtrl(NULL);
 			}
 		}
 
@@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape()
 		}
 
         LLCoordGL screen_min;
-		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f);
-		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f);
+		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f);
+		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);
 
 		LLCoordGL screen_max;
-		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f);
-		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f);
+		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f);
+		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);
 
 		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
 		LLRect media_controls_rect;
@@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape()
 		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
 		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
 		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
-
-		LLRect old_hud_rect = media_controls_rect;
+		
 		// keep all parts of HUD on-screen
 		media_controls_rect.intersectWith(getParent()->getLocalRect());
+		if (mCurrentZoom != ZOOM_NONE)
+			media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight();
 
 		// clamp to minimum size, keeping centered
 		media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
-			llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight()));
+			llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
 
 		setShape(media_controls_rect, true);
 
@@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom()
 		}
 	case ZOOM_FAR:
 		{
-			zoom_padding = ZOOM_FAR_PADDING;
+			zoom_padding = mZoomFarPadding;
 			break;
 		}
 	case ZOOM_MEDIUM:
 		{
-			zoom_padding = ZOOM_MEDIUM_PADDING;
+			zoom_padding = mZoomMediumPadding;
 			break;
 		}
 	case ZOOM_NEAR:
 		{
-			zoom_padding = ZOOM_NEAR_PADDING;
+			zoom_padding = mZoomNearPadding;
 			break;
 		}
 	default:
@@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom()
 		}
 	}
 
-	if (zoom_padding > 0.0f)		
+	if (zoom_padding > 0.0f)
+	{
 		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+	}
+	
+	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
+	mZoomObjectID = mTargetObjectID;
+	mZoomObjectFace = mTargetObjectFace;
 }
+
 void LLPanelPrimMediaControls::onScrollUp(void* user_data)
 {
 	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index accfb72a0494c5eb45b4875748c2bbd40c4b41e4..fe8f100abe8ec68a970dab55c37b92165ae16186 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -160,6 +160,11 @@ class LLPanelPrimMediaControls : public LLPanel
 	LLUICtrl *mRightBookend;
 	LLUIImage* mBackgroundImage;
 	F32 mSkipStep;
+	S32 mMinWidth;
+	S32 mMinHeight;
+	F32 mZoomNearPadding;
+	F32 mZoomMediumPadding;
+	F32 mZoomFarPadding;
 	
 	LLUICtrl *mMediaPanelScroll;
 	LLButton *mScrollUpCtrl;
@@ -190,6 +195,9 @@ class LLPanelPrimMediaControls : public LLPanel
 	S32 mTargetObjectFace;
 	LLUUID mTargetImplID;
 	LLVector3 mTargetObjectNormal;
+	
+	LLUUID mZoomObjectID;
+	S32 mZoomObjectFace;
 };
 
 #endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 67d0e137863106efe0d0134a574e0bb1dda03ac7..327048d4f3682fa8e5e9d5bd456e3a96f8877518 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -41,6 +41,7 @@
 #include "llaccordionctrl.h"
 #include "llaccordionctrltab.h"
 #include "llflatlistview.h"
+#include "llnotificationsutil.h"
 #include "lltextbox.h"
 #include "llviewermenu.h"
 #include "llviewerinventory.h"
@@ -51,6 +52,8 @@
 // Used to limit time spent for items list update per frame.
 static const U32 ADD_LIMIT = 50;
 
+static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+
 class LLTeleportHistoryFlatItem : public LLPanel
 {
 public:
@@ -253,6 +256,10 @@ BOOL LLTeleportHistoryPanel::postBuild()
 				LLAccordionCtrlTab* tab = (LLAccordionCtrlTab*)*iter;
 				tab->setRightMouseDownCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionTabRightClick, this, _1, _2, _3, _4));
 				tab->setDisplayChildren(false);
+				tab->setDropDownStateChangedCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionExpand, this, _1, _2));
+
+				// All accordion tabs are collapsed initially
+				setAccordionCollapsedByUser(tab, true);
 
 				mItemContainers.put(tab);
 
@@ -269,10 +276,18 @@ BOOL LLTeleportHistoryPanel::postBuild()
 
 		// Open first 2 accordion tabs
 		if (mItemContainers.size() > 1)
-			mItemContainers.get(mItemContainers.size() - 1)->setDisplayChildren(true);
+		{
+			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1);
+			tab->setDisplayChildren(true);
+			setAccordionCollapsedByUser(tab, false);
+		}
 
 		if (mItemContainers.size() > 2)
-			mItemContainers.get(mItemContainers.size() - 2)->setDisplayChildren(true);
+		{
+			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 2);
+			tab->setDisplayChildren(true);
+			setAccordionCollapsedByUser(tab, false);
+		}
 	}
 
 	getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this));
@@ -490,6 +505,18 @@ void LLTeleportHistoryPanel::refresh()
 			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
 			tab->setVisible(true);
 
+			// Expand all accordion tabs when filtering
+			if(!mFilterSubString.empty())
+			{
+				tab->setDisplayChildren(true);
+			}
+			// Restore each tab's expand state when not filtering
+			else
+			{
+				bool collapsed = isAccordionCollapsedByUser(tab);
+				tab->setDisplayChildren(!collapsed);
+			}
+
 			curr_flat_view = getFlatListViewFromTab(tab);
 		}
 
@@ -722,13 +749,13 @@ void LLTeleportHistoryPanel::onCollapseAllFolders()
 
 void LLTeleportHistoryPanel::onClearTeleportHistory()
 {
-	LLNotifications::instance().add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2));
+	LLNotificationsUtil::add("ConfirmClearTeleportHistory", LLSD(), LLSD(), boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistoryDialog, this, _1, _2));
 }
 
 bool LLTeleportHistoryPanel::onClearTeleportHistoryDialog(const LLSD& notification, const LLSD& response)
 {
 
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (0 == option)
 	{
@@ -774,3 +801,26 @@ void LLTeleportHistoryPanel::onGearButtonClicked()
 	LLMenuGL::showPopup(this, menu, menu_x, menu_y);
 }
 
+void LLTeleportHistoryPanel::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+	LLSD param = acc_tab->getValue();
+	param[COLLAPSED_BY_USER] = collapsed;
+	acc_tab->setValue(param);
+}
+
+bool LLTeleportHistoryPanel::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+	LLSD param = acc_tab->getValue();
+	if(!param.has("acc_collapsed"))
+	{
+		return false;
+	}
+	return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param)
+{
+	bool expanded = param.asBoolean();
+	// Save accordion tab state to restore it in refresh()
+	setAccordionCollapsedByUser(ctrl, !expanded);
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index a31ff34cb6add0af9d2f1039589d6d840e6d5718..f646fea355cb49788edfa3f31066016f12a341de 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -98,6 +98,10 @@ class LLTeleportHistoryPanel : public LLPanelPlacesTab
 	LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *);
 	void onGearButtonClicked();
 
+	void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+	bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+	void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
+
 	LLTeleportHistoryStorage*	mTeleportHistory;
 	LLAccordionCtrl*		mHistoryAccordion;
 
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 4ee9cba69cae03fe203bf7bf3fc70014baaf8081..07a1214b4f412cd8dbe74c5dab38bb5726c412fa 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -47,10 +47,11 @@
 #if LL_MSVC
 #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
 #endif
-LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list,  bool use_context_menu/* = true*/):
 	mSpeakerMgr(data_source),
 	mAvatarList(avatar_list),
 	mSortOrder(E_SORT_BY_NAME)
+,	mParticipantListMenu(NULL)
 {
 	mSpeakerAddListener = new SpeakerAddListener(*this);
 	mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
@@ -68,8 +69,15 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
     // Set onAvatarListDoubleClicked as default on_return action.
 	mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
 
-	mParticipantListMenu = new LLParticipantListMenu(*this);
-	mAvatarList->setContextMenu(mParticipantListMenu);
+	if (use_context_menu)
+	{
+		mParticipantListMenu = new LLParticipantListMenu(*this);
+		mAvatarList->setContextMenu(mParticipantListMenu);
+	}
+	else
+	{
+		mAvatarList->setContextMenu(NULL);
+	}
 
 	//Lets fill avatarList with existing speakers
 	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -79,12 +87,13 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
 	for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
 	{
 		const LLPointer<LLSpeaker>& speakerp = *it;
-		group_members.push_back(speakerp->mID);
+		addAvatarIDExceptAgent(group_members, speakerp->mID);
 		if ( speakerp->mIsModerator )
 		{
 			mModeratorList.insert(speakerp->mID);
 		}
 	}
+	mAvatarList->setDirty(true);
 	sort();
 }
 
@@ -183,7 +192,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
 		return true;
 	}
 
-	group_members.push_back(uu_id);
+	addAvatarIDExceptAgent(group_members, uu_id);
 	// Mark AvatarList as dirty one
 	mAvatarList->setDirty();
 	sort();
@@ -251,6 +260,15 @@ void LLParticipantList::sort()
 	}
 }
 
+// static
+void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
+{
+	if (gAgent.getID() != avatar_id)
+	{
+		existing_list.push_back(avatar_id);
+	}
+}
+
 //
 // LLParticipantList::SpeakerAddListener
 //
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 5e26c39fc81a6187fe6540b2fd0458d8396825c7..460cf4b9efe938dca764899577bfe0c29f04a89b 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -43,7 +43,7 @@ class LLParticipantList
 {
 	LOG_CLASS(LLParticipantList);
 	public:
-		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
+		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true);
 		~LLParticipantList();
 		void setSpeakingIndicatorsVisible(BOOL visible);
 
@@ -132,6 +132,11 @@ class LLParticipantList
 		void onAvatarListDoubleClicked(LLAvatarList* list);
 		void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
 
+		/**
+		 * Adds specified avatar ID to the existing list if it is not Agent's ID
+		 */
+		static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id);
+
 		LLSpeakerMgr*		mSpeakerMgr;
 		LLAvatarList*		mAvatarList;
 
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 3d2c529dda6e29a11c3d439024d0647d0e3c3dbe..30cb21c83ccfe0847277a251a412895f5269ceeb 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -43,6 +43,7 @@
 #include "lldir.h"
 #include "llfloaterreg.h"
 #include "llmultigesture.h"
+#include "llnotificationsutil.h"
 #include "llvfile.h"
 
 // newview
@@ -254,7 +255,7 @@ BOOL LLPreviewGesture::canClose()
 	else
 	{
 		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(),
+		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(),
 			boost::bind(&LLPreviewGesture::handleSaveChangesDialog, this, _1, _2) );
 		return FALSE;
 	}
@@ -283,7 +284,7 @@ void LLPreviewGesture::onVisibilityChange ( const LLSD& new_visibility )
 
 bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:  // "Yes"
@@ -1054,14 +1055,14 @@ void LLPreviewGesture::saveIfNeeded()
 
 	if (dp.getCurrentSize() > 1000)
 	{
-		LLNotifications::instance().add("GestureSaveFailedTooManySteps");
+		LLNotificationsUtil::add("GestureSaveFailedTooManySteps");
 
 		delete gesture;
 		gesture = NULL;
 	}
 	else if (!ok)
 	{
-		LLNotifications::instance().add("GestureSaveFailedTryAgain");
+		LLNotificationsUtil::add("GestureSaveFailedTryAgain");
 		delete gesture;
 		gesture = NULL;
 	}
@@ -1200,7 +1201,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,
 			}
 			else
 			{
-				LLNotifications::instance().add("GestureSaveFailedObjectNotFound");
+				LLNotificationsUtil::add("GestureSaveFailedObjectNotFound");
 			}
 		}
 
@@ -1216,7 +1217,7 @@ void LLPreviewGesture::onSaveComplete(const LLUUID& asset_uuid, void* user_data,
 		llwarns << "Problem saving gesture: " << status << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("GestureSaveFailedReason", args);
+		LLNotificationsUtil::add("GestureSaveFailedReason", args);
 	}
 	delete info;
 	info = NULL;
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index ce81077d802fd492160a51bd7c3f1de59f13c200..5d675fcda66b57fec9de9428943decc70cce828f 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -43,6 +43,7 @@
 #include "llfloaterreg.h"
 #include "llinventorymodel.h"
 #include "lllineeditor.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llresmgr.h"
 #include "roles_constants.h"
@@ -153,7 +154,7 @@ BOOL LLPreviewNotecard::canClose()
 	else
 	{
 		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
+		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLPreviewNotecard::handleSaveChangesDialog,this, _1, _2));
 								  
 		return FALSE;
 	}
@@ -330,15 +331,15 @@ void LLPreviewNotecard::onLoadComplete(LLVFS *vfs,
 			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
 				LL_ERR_FILE_EMPTY == status)
 			{
-				LLNotifications::instance().add("NotecardMissing");
+				LLNotificationsUtil::add("NotecardMissing");
 			}
 			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
 			{
-				LLNotifications::instance().add("NotecardNoPermissions");
+				LLNotificationsUtil::add("NotecardNoPermissions");
 			}
 			else
 			{
-				LLNotifications::instance().add("UnableToLoadNotecard");
+				LLNotificationsUtil::add("UnableToLoadNotecard");
 			}
 
 			llwarns << "Problem loading notecard: " << status << llendl;
@@ -493,7 +494,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
 			}
 			else
 			{
-				LLNotifications::instance().add("SaveNotecardFailObjectNotFound");
+				LLNotificationsUtil::add("SaveNotecardFailObjectNotFound");
 			}
 		}
 		// Perform item copy to inventory
@@ -519,7 +520,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
 		llwarns << "Problem saving notecard: " << status << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("SaveNotecardFailReason", args);
+		LLNotificationsUtil::add("SaveNotecardFailReason", args);
 	}
 
 	std::string uuid_string;
@@ -532,7 +533,7 @@ void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data
 
 bool LLPreviewNotecard::handleSaveChangesDialog(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case 0:  // "Yes"
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 4e4711f8fbdd9729cc72a9ff6065b227d8b4ab6c..0362fdbf56014d31197657443577c870ce5aea6f 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -45,7 +45,7 @@
 #include "llkeyboard.h"
 #include "lllineeditor.h"
 #include "llhelp.h"
-
+#include "llnotificationsutil.h"
 #include "llresmgr.h"
 #include "llscrollbar.h"
 #include "llscrollcontainer.h"
@@ -618,14 +618,14 @@ BOOL LLScriptEdCore::canClose()
 	else
 	{
 		// Bring up view-modal dialog: Save changes? Yes, No, Cancel
-		LLNotifications::instance().add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
+		LLNotificationsUtil::add("SaveChanges", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleSaveChangesDialog, this, _1, _2));
 		return FALSE;
 	}
 }
 
 bool LLScriptEdCore::handleSaveChangesDialog(const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch( option )
 	{
 	case 0:  // "Yes"
@@ -798,7 +798,7 @@ void LLScriptEdCore::onBtnUndoChanges()
 {
 	if( !mEditor->tryToRevertToPristineState() )
 	{
-		LLNotifications::instance().add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2));
+		LLNotificationsUtil::add("ScriptCannotUndo", LLSD(), LLSD(), boost::bind(&LLScriptEdCore::handleReloadFromServerDialog, this, _1, _2));
 	}
 }
 
@@ -827,7 +827,7 @@ void LLScriptEdCore::onErrorList(LLUICtrl*, void* user_data)
 
 bool LLScriptEdCore::handleReloadFromServerDialog(const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch( option )
 	{
 	case 0: // "Yes"
@@ -1281,7 +1281,7 @@ void LLPreviewLSL::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32
 		llwarns << "Problem saving script: " << status << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("SaveScriptFailReason", args);
+		LLNotificationsUtil::add("SaveScriptFailReason", args);
 	}
 	delete info;
 }
@@ -1319,7 +1319,7 @@ void LLPreviewLSL::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* user_d
 		llwarns << "Problem saving LSL Bytecode (Preview)" << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("SaveBytecodeFailReason", args);
+		LLNotificationsUtil::add("SaveBytecodeFailReason", args);
 	}
 	delete instance_uuid;
 }
@@ -1364,15 +1364,15 @@ void LLPreviewLSL::onLoadComplete( LLVFS *vfs, const LLUUID& asset_uuid, LLAsset
 			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
 				LL_ERR_FILE_EMPTY == status)
 			{
-				LLNotifications::instance().add("ScriptMissing");
+				LLNotificationsUtil::add("ScriptMissing");
 			}
 			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
 			{
-				LLNotifications::instance().add("ScriptNoPermissions");
+				LLNotificationsUtil::add("ScriptNoPermissions");
 			}
 			else
 			{
-				LLNotifications::instance().add("UnableToLoadScript");
+				LLNotificationsUtil::add("UnableToLoadScript");
 			}
 
 			preview->mAssetStatus = PREVIEW_ASSET_ERROR;
@@ -1605,15 +1605,15 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id,
 			if( LL_ERR_ASSET_REQUEST_NOT_IN_DATABASE == status ||
 				LL_ERR_FILE_EMPTY == status)
 			{
-				LLNotifications::instance().add("ScriptMissing");
+				LLNotificationsUtil::add("ScriptMissing");
 			}
 			else if (LL_ERR_INSUFFICIENT_PERMISSIONS == status)
 			{
-				LLNotifications::instance().add("ScriptNoPermissions");
+				LLNotificationsUtil::add("ScriptNoPermissions");
 			}
 			else
 			{
-				LLNotifications::instance().add("UnableToLoadScript");
+				LLNotificationsUtil::add("UnableToLoadScript");
 			}
 			instance->mAssetStatus = PREVIEW_ASSET_ERROR;
 		}
@@ -1698,7 +1698,7 @@ void LLLiveLSLEditor::onRunningCheckboxClicked( LLUICtrl*, void* userdata )
 	else
 	{
 		runningCheckbox->set(!running);
-		LLNotifications::instance().add("CouldNotStartStopScript");
+		LLNotificationsUtil::add("CouldNotStartStopScript");
 	}
 }
 
@@ -1721,7 +1721,7 @@ void LLLiveLSLEditor::onReset(void *userdata)
 	}
 	else
 	{
-		LLNotifications::instance().add("CouldNotStartStopScript"); 
+		LLNotificationsUtil::add("CouldNotStartStopScript"); 
 	}
 }
 
@@ -1814,7 +1814,7 @@ void LLLiveLSLEditor::saveIfNeeded()
 	LLViewerObject* object = gObjectList.findObject(mObjectUUID);
 	if(!object)
 	{
-		LLNotifications::instance().add("SaveScriptFailObjectNotFound");
+		LLNotificationsUtil::add("SaveScriptFailObjectNotFound");
 		return;
 	}
 
@@ -1822,7 +1822,7 @@ void LLLiveLSLEditor::saveIfNeeded()
 	{
 		// $NOTE: While the error message may not be exactly correct,
 		// it's pretty close.
-		LLNotifications::instance().add("SaveScriptFailObjectNotFound");
+		LLNotificationsUtil::add("SaveScriptFailObjectNotFound");
 		return;
 	}
 
@@ -2023,7 +2023,7 @@ void LLLiveLSLEditor::onSaveTextComplete(const LLUUID& asset_uuid, void* user_da
 		llwarns << "Unable to save text for a script." << llendl;
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("CompileQueueSaveText", args);
+		LLNotificationsUtil::add("CompileQueueSaveText", args);
 	}
 	else
 	{
@@ -2082,7 +2082,7 @@ void LLLiveLSLEditor::onSaveBytecodeComplete(const LLUUID& asset_uuid, void* use
 
 		LLSD args;
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(status));
-		LLNotifications::instance().add("CompileQueueSaveBytecode", args);
+		LLNotificationsUtil::add("CompileQueueSaveBytecode", args);
 	}
 
 	std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,asset_uuid.asString());
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index 41cf402d6f4bc6b05b5e97bb887ae0907d4e85cd..698f6152b4ade605720148bd8f1b82fcc50e24ba 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -43,6 +43,7 @@
 #include "llfloaterreg.h"
 #include "llimagetga.h"
 #include "llinventory.h"
+#include "llnotificationsutil.h"
 #include "llresmgr.h"
 #include "lltrans.h"
 #include "lltextbox.h"
@@ -352,13 +353,13 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
 		{
 			LLSD args;
 			args["FILE"] = self->mSaveFileName;
-			LLNotifications::instance().add("CannotEncodeFile", args);
+			LLNotificationsUtil::add("CannotEncodeFile", args);
 		}
 		else if( !image_tga->save( self->mSaveFileName ) )
 		{
 			LLSD args;
 			args["FILE"] = self->mSaveFileName;
-			LLNotifications::instance().add("CannotWriteFile", args);
+			LLNotificationsUtil::add("CannotWriteFile", args);
 		}
 		else
 		{
@@ -371,7 +372,7 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success,
 
 	if( self && !success )
 	{
-		LLNotifications::instance().add("CannotDownloadFile");
+		LLNotificationsUtil::add("CannotDownloadFile");
 	}
 
 }
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index bdea6ff45944cafea6f4a40c786b4c8b9cdb91f0..c58caf9c60991504278e37b15a41b01c31b9decb 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -37,6 +37,7 @@
 #include "llchannelmanager.h"
 #include "llchiclet.h"
 #include "llfloaterreg.h"
+#include "llnotifications.h"
 #include "llscreenchannel.h"
 #include "lltoastnotifypanel.h"
 #include "llviewerwindow.h"
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 4cb561381dbd049fa457a8af6efde8183312b947..2554f1ccd58454ac61b5bcb225ab7c0125038fd7 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -41,6 +41,7 @@
 #include "lleconomy.h"
 #include "llgl.h"
 #include "llrender.h"
+#include "llnotifications.h"
 #include "llpermissions.h"
 #include "llpermissionsflags.h"
 #include "lltrans.h"
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 4396cce545142f7646ca6bf0eb66e2fc2a0f73a3..09e067b5f950c8ebc7e490f820f999eb6190f996 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -41,6 +41,7 @@
 #include "llcategory.h"
 #include "llclickaction.h"
 #include "llfocusmgr.h"
+#include "llnotificationsutil.h"
 #include "llstring.h"
 
 #include "llviewerwindow.h"
@@ -865,7 +866,7 @@ void LLSidepanelTaskInfo::cbGroupID(LLUUID group_id)
 
 static bool callback_deed_to_group(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LLUUID group_id;
@@ -881,7 +882,7 @@ static bool callback_deed_to_group(const LLSD& notification, const LLSD& respons
 
 void LLSidepanelTaskInfo::onClickDeedToGroup()
 {
-	LLNotifications::instance().add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
+	LLNotificationsUtil::add( "DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
 }
 
 ///----------------------------------------------------------------------------
@@ -1014,7 +1015,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
 		LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
 		if (!sale_info.isForSale())
 		{
-			LLNotifications::instance().add("CantSetBuyObject");
+			LLNotificationsUtil::add("CantSetBuyObject");
 
 			// Set click action back to its old value
 			U8 click_action = 0;
@@ -1032,7 +1033,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
 		if (!can_pay)
 		{
 			// Warn, but do it anyway.
-			LLNotifications::instance().add("ClickActionNotPayable");
+			LLNotificationsUtil::add("ClickActionNotPayable");
 		}
 	}
 	LLSelectMgr::getInstance()->selectionSetClickAction(click_action);
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index ee5fa46c9cacd302850c94cb9f07c36e13272be8..ee62d689b5df56aa2cf94ede770c922c3f436d24 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -583,6 +583,17 @@ void LLSideTray::expandSideBar()
 	mActiveTab->onOpen(key);
 
 	reflectCollapseChange();
+
+
+	std::string name = mActiveTab->getName();
+	std::map<std::string,LLButton*>::const_iterator btn_it =
+		mTabButtons.find(name);
+	if (btn_it != mTabButtons.end())
+	{
+		LLButton* btn = btn_it->second;
+		btn->setImageOverlay( mActiveTab->mImageSelected  );
+	}
+
 }
 
 void LLSideTray::highlightFocused()
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 54f776ca6a7fa5253e228375a5a189b59cf282bd..5edc4804ca8f16d56e1c69667a975e087fb6bbb6 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -32,19 +32,14 @@
 
 #include "llviewerprecompiledheaders.h" // must be first include
 
-#include "llagent.h"
-#include "llbottomtray.h"
+#include "llbutton.h"
 #include "llfloaterreg.h"
-#include "llvoiceclient.h"
-#include "llvoicecontrolpanel.h"
-#include "lltransientfloatermgr.h"
 
-#include "llavatariconctrl.h"
-#include "llbutton.h"
-#include "llpanel.h"
-#include "lltextbox.h"
+#include "llagent.h"
+#include "llbottomtray.h"
+#include "llcallfloater.h"
 #include "lloutputmonitorctrl.h"
-#include "llgroupmgr.h"
+#include "lltransientfloatermgr.h"
 
 #include "llspeakbutton.h"
 
@@ -72,7 +67,6 @@ void LLSpeakButton::draw()
 
 LLSpeakButton::LLSpeakButton(const Params& p)
 : LLUICtrl(p)
-, mPrivateCallPanel(NULL)
 , mOutputMonitor(NULL)
 , mSpeakBtn(NULL)
 , mShowBtn(NULL)
@@ -102,8 +96,8 @@ LLSpeakButton::LLSpeakButton(const Params& p)
 	addChild(mShowBtn);
 	LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
 
-	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
-	mShowBtn->setToggleState(FALSE);
+// 	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
+// 	mShowBtn->setToggleState(FALSE);
 
 	static const S32 MONITOR_RIGHT_PAD = 2;
 
@@ -175,42 +169,3 @@ void LLSpeakButton::onMouseUp_SpeakBtn()
 	gVoiceClient->inputUserControlState(down);
 }
 
-void LLSpeakButton::onClick_ShowBtn()
-{
-	if(!mShowBtn->getToggleState())
-	{
-		mPrivateCallPanel->onClickClose(mPrivateCallPanel);
-		delete mPrivateCallPanel;
-		mPrivateCallPanel = NULL;
-		mShowBtn->setToggleState(FALSE);
-		return;
-	}
-
-	S32 x = mSpeakBtn->getRect().mLeft;
-	S32 y = 0;
-
-	localPointToScreen(x, y, &x, &y);
-
-	mPrivateCallPanel = new LLVoiceControlPanel;
-	getRootView()->addChild(mPrivateCallPanel);
-
-	y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight();
-
-	LLRect rect;
-	rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight());
-	mPrivateCallPanel->setRect(rect);
-
-
-	LLAvatarListItem* item = new LLAvatarListItem();
-	item->showLastInteractionTime(false);
-	item->showInfoBtn(true);
-	item->showSpeakingIndicator(true);
-	item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE);
-
-	mPrivateCallPanel->addItem(item);
-	mPrivateCallPanel->setVisible(TRUE);
-	mPrivateCallPanel->setFrontmost(TRUE);
-
-	mShowBtn->setToggleState(TRUE);
-}
-
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 424ee5357a440f7dc6f28897bae4a491099bdde7..6660b502407a411925bc041d96a5aca811032d8a 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -36,7 +36,7 @@
 #include "llinitparam.h"
 #include "lluictrl.h"
 
-class LLVoiceControlPanel;
+class LLCallFloater;
 class LLButton;
 class LLOutputMonitorCtrl;
 
@@ -86,12 +86,10 @@ class LLSpeakButton : public LLUICtrl
 	void onMouseDown_SpeakBtn();
 	void onMouseUp_SpeakBtn();
 
-	void onClick_ShowBtn();
-
 private:
 	LLButton*	mSpeakBtn;
 	LLButton*	mShowBtn;
-	LLVoiceControlPanel* mPrivateCallPanel;
+	LLHandle<LLFloater> mPrivateCallPanel;
 	LLOutputMonitorCtrl* mOutputMonitor;
 };
 
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 736be677104a9bd486513a1c439215c42e8229d2..db8bda008ebdb5b9c29a4d909eda88a6cd00273d 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -66,6 +66,8 @@
 #include "llmemorystream.h"
 #include "llmessageconfig.h"
 #include "llmoveview.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llteleporthistory.h"
 #include "llregionhandle.h"
 #include "llsd.h"
@@ -99,7 +101,6 @@
 #include "llfeaturemanager.h"
 #include "llfirstuse.h"
 #include "llfloaterchat.h"
-#include "llfloatergesture.h"
 #include "llfloaterhud.h"
 #include "llfloaterland.h"
 #include "llfloaterpreference.h"
@@ -297,23 +298,6 @@ namespace
 	};
 }
 
-class LLGestureInventoryFetchObserver : public LLInventoryFetchObserver
-{
-public:
-	LLGestureInventoryFetchObserver() {}
-	virtual void done()
-	{
-		// we've downloaded all the items, so repaint the dialog
-		LLFloaterGesture* floater = LLFloaterReg::findTypedInstance<LLFloaterGesture>("gestures");
-		if (floater)
-		{
-			floater->refreshAll();
-		}
-		gInventory.removeObserver(this);
-		delete this;
-	}
-};
-
 void update_texture_fetch()
 {
 	LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
@@ -444,16 +428,16 @@ bool idle_startup()
 
 		if (LLFeatureManager::getInstance()->isSafe())
 		{
-			LLNotifications::instance().add("DisplaySetToSafe");
+			LLNotificationsUtil::add("DisplaySetToSafe");
 		}
 		else if ((gSavedSettings.getS32("LastFeatureVersion") < LLFeatureManager::getInstance()->getVersion()) &&
 				 (gSavedSettings.getS32("LastFeatureVersion") != 0))
 		{
-			LLNotifications::instance().add("DisplaySetToRecommended");
+			LLNotificationsUtil::add("DisplaySetToRecommended");
 		}
 		else if (!gViewerWindow->getInitAlert().empty())
 		{
-			LLNotifications::instance().add(gViewerWindow->getInitAlert());
+			LLNotificationsUtil::add(gViewerWindow->getInitAlert());
 		}
 			
 		gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
@@ -1156,7 +1140,7 @@ bool idle_startup()
 					LLSD args;
 					args["ERROR_MESSAGE"] = emsg.str();
 					LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
-					LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
+					LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
 				}
 
 				//setup map of datetime strings to codes and slt & local time offset from utc
@@ -1179,7 +1163,7 @@ bool idle_startup()
 				LLSD args;
 				args["ERROR_MESSAGE"] = emsg.str();
 				LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
-				LLNotifications::instance().add("ErrorMessage", args, LLSD(), login_alert_done);
+				LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
 				transition_back_to_login_panel(emsg.str());
 				show_connect_box = true;
 			}
@@ -1823,11 +1807,8 @@ bool idle_startup()
 						item_ids.push_back(item_id);
 					}
 				}
-
-				LLGestureInventoryFetchObserver* fetch = new LLGestureInventoryFetchObserver();
-				fetch->fetchItems(item_ids);
-				// deletes itself when done
-				gInventory.addObserver(fetch);
+				// no need to add gesture to inventory observer, it's already made in constructor 
+				LLGestureManager::instance().fetchItems(item_ids);
 			}
 		}
 		gDisplaySwapBuffers = TRUE;
@@ -1899,7 +1880,7 @@ bool idle_startup()
 				{
 					msg = "AvatarMovedLast";
 				}
-				LLNotifications::instance().add(msg);
+				LLNotificationsUtil::add(msg);
 			}
 		}
 
@@ -1984,7 +1965,7 @@ bool idle_startup()
 			// initial outfit, but if the load hasn't started
 			// already then something is wrong so fall back
 			// to generic outfits. JC
-			LLNotifications::instance().add("WelcomeChooseSex", LLSD(), LLSD(),
+			LLNotificationsUtil::add("WelcomeChooseSex", LLSD(), LLSD(),
 				callback_choose_gender);
 			LLStartUp::setStartupState( STATE_CLEANUP );
 			return TRUE;
@@ -1992,7 +1973,7 @@ bool idle_startup()
 		
 		if (wearables_time > MAX_WEARABLES_TIME)
 		{
-			LLNotifications::instance().add("ClothingLoading");
+			LLNotificationsUtil::add("ClothingLoading");
 			LLViewerStats::getInstance()->incStat(LLViewerStats::ST_WEARABLES_TOO_LONG);
 			LLStartUp::setStartupState( STATE_CLEANUP );
 			return TRUE;
@@ -2318,12 +2299,12 @@ bool is_hex_string(U8* str, S32 len)
 
 void show_first_run_dialog()
 {
-	LLNotifications::instance().add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
+	LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
 }
 
 bool first_run_dialog_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LL_DEBUGS("AppInit") << "First run dialog cancelling" << LL_ENDL;
@@ -2346,7 +2327,7 @@ void set_startup_status(const F32 frac, const std::string& string, const std::st
 
 bool login_alert_status(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
     // Buttons
     switch( option )
     {
@@ -2380,7 +2361,7 @@ void use_circuit_callback(void**, S32 result)
 		{
 			// Make sure user knows something bad happened. JC
 			LL_WARNS("AppInit") << "Backing up to login screen!" << LL_ENDL;
-			LLNotifications::instance().add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
+			LLNotificationsUtil::add("LoginPacketNeverReceived", LLSD(), LLSD(), login_alert_status);
 			reset_login();
 		}
 		else
@@ -2585,7 +2566,7 @@ const S32 OPT_FEMALE = 1;
 
 bool callback_choose_gender(const LLSD& notification, const LLSD& response)
 {	
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	switch(option)
 	{
 	case OPT_MALE:
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index b649a0c38ebd45243f9dea3073b3d1f534dfec43..4915720036d7dd89fad49dd10cf624537be2a797 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -42,6 +42,7 @@
 #include "llfloaterbuycurrency.h"
 #include "llfloaterchat.h"
 #include "llfloaterlagmeter.h"
+#include "llfloatervolumepulldown.h"
 #include "llfloaterregioninfo.h"
 #include "llfloaterscriptdebug.h"
 #include "llhudicon.h"
@@ -72,12 +73,14 @@
 #include "llfocusmgr.h"
 #include "llappviewer.h"
 #include "lltrans.h"
+
 // library includes
 #include "imageids.h"
 #include "llfloaterreg.h"
 #include "llfontgl.h"
 #include "llrect.h"
 #include "llerror.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "llstring.h"
 #include "message.h"
@@ -157,6 +160,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 
 	mBtnVolume = getChild<LLButton>( "volume_btn" );
 	mBtnVolume->setClickedCallback( onClickVolume, this );
+	mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
 
 	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
 
@@ -201,7 +205,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
 	addChild(mSGPacketLoss);
 
 	childSetActionTextbox("stat_btn", onClickStatGraph);
-
 }
 
 LLStatusBar::~LLStatusBar()
@@ -242,7 +245,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
 
 BOOL LLStatusBar::postBuild()
 {
-
 	gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
 
 	return TRUE;
@@ -496,7 +498,7 @@ static void onClickBuyCurrency(void* data)
 
 static void onClickHealth(void* )
 {
-	LLNotifications::instance().add("NotSafe");
+	LLNotificationsUtil::add("NotSafe");
 }
 
 static void onClickScriptDebug(void*)
@@ -504,6 +506,13 @@ static void onClickScriptDebug(void*)
 	LLFloaterScriptDebug::show(LLUUID::null);
 }
 
+//static
+void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
+{
+	// show the master volume pull-down
+	LLFloaterReg::showInstance("volume_pulldown");
+}
+
 static void onClickVolume(void* data)
 {
 	// toggle the master mute setting
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index bdaacce981d653b584e0eef1e848658ba5071aef..f77cc1acb863f592a616bee261dfcbfdf946756b 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -47,6 +47,7 @@ class LLUICtrl;
 class LLUUID;
 class LLFrameTimer;
 class LLStatGraph;
+class LLPanelVolumePulldown;
 
 class LLStatusBar
 :	public LLPanel
@@ -92,8 +93,8 @@ class LLStatusBar
 
 	void onVolumeChanged(const LLSD& newvalue);
 
+	static void onMouseEnterVolume(LLUICtrl* ctrl);
 	static void onClickStatGraph(void* data);
-	
 
 private:
 	LLTextBox	*mTextHealth;
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index f9cbdc20d60dc67b0df1f53bbe75a9183ff956f2..bf485b7e6528a976aca5d8ba3fc4a66238565931 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -36,6 +36,7 @@
 
 #include "llbutton.h"
 #include "llfocusmgr.h"
+#include "llnotifications.h"
 #include "llviewercontrol.h"
 
 using namespace LLNotificationsUI;
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index b670f470452d4b1b1b38b5fbc07c7ab5fe97e342..769b2ba122915e7268db888b03416d0215191908 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -37,7 +37,7 @@
 #include "llpanel.h"
 #include "llmodaldialog.h"
 #include "lltimer.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
 
 #include "llviewercontrol.h"
 
diff --git a/indra/newview/lltoastalertpanel.h b/indra/newview/lltoastalertpanel.h
index 840143a2a933e388e3f92463adc151710fa434ce..38a635e8a452d78d66ab88b63c8b7a22503e5bc8 100644
--- a/indra/newview/lltoastalertpanel.h
+++ b/indra/newview/lltoastalertpanel.h
@@ -40,7 +40,7 @@
 #include "lltoastpanel.h"
 #include "llfloater.h"
 #include "llui.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
 #include "llalertdialog.h"
 
 class LLButton;
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index d1bdcb13543da05606a3bd8867331aa842411312..eacc077a652d546898ea17226cd3e4c3d86ad58e 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -39,6 +39,7 @@
 #include "llbutton.h"
 #include "lliconctrl.h"
 #include "llinventoryfunctions.h"
+#include "llnotifications.h"
 #include "llnotify.h"
 #include "llviewertexteditor.h"
 
@@ -205,7 +206,7 @@ void LLToastGroupNotifyPanel::onClickAttachment()
 
 		//if attachment isn't openable - notify about saving
 		if (!isAttachmentOpenable(mInventoryOffer->mType)) {
-			LLNotifications::instance().add("AttachmentSaved");
+			LLNotifications::instance().add("AttachmentSaved", LLSD(), LLSD());
 		}
 
 		mInventoryOffer = NULL;
diff --git a/indra/newview/lltoastgroupnotifypanel.h b/indra/newview/lltoastgroupnotifypanel.h
index e3d0ef45cba131292dea9f7b7f5cd7f83f42011d..4879000e8c22f6810ea361cc223cc14473fed229 100644
--- a/indra/newview/lltoastgroupnotifypanel.h
+++ b/indra/newview/lltoastgroupnotifypanel.h
@@ -38,7 +38,7 @@
 #include "lldarray.h"
 #include "lltimer.h"
 #include "llviewermessage.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
 
 class LLButton;
 
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 9040bdb41ab41f9c75fc9c7ac6cf5090340e46c6..f928b5f243b5dc840b1ad22b9824863234f5394f 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -33,6 +33,8 @@
 #include "llviewerprecompiledheaders.h"
 #include "lltoastimpanel.h"
 
+#include "llnotifications.h"
+
 const S32 LLToastIMPanel::DEFAULT_MESSAGE_MAX_LINE_COUNT	= 6;
 
 //--------------------------------------------------------------------------
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 699424ef361c577619858cf91fe4138a632c8b61..6b9bff7b9e57ecd993e698337c35344897db803b 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -33,7 +33,12 @@
 #include "llviewerprecompiledheaders.h"
 
 #include "lltoastnotifypanel.h"
+
+// project includes
 #include "llviewercontrol.h"
+
+// library includes
+#include "llnotifications.h"
 #include "lluiconstants.h"
 #include "llrect.h"
 #include "lltrans.h"
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index eea70705ec1abf0dc50a5e9fc1f7ef2b012172a9..04525387b36359be42ec895a927ece4a1f3b3ae6 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -35,13 +35,14 @@
 
 #include "llpanel.h"
 #include "llfontgl.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
 #include "llbutton.h"
 #include "lltoastpanel.h"
 #include "lliconctrl.h"
 #include "lltexteditor.h"
 #include "lltextbox.h"
 
+class LLNotificationForm;
 
 /**
  * Toast panel for notification.
@@ -68,7 +69,7 @@ class LLToastNotifyPanel: public LLToastPanel
 
 private:
 
-	void adjustPanelForScriptNotice(const LLNotificationFormPtr form);
+	void adjustPanelForScriptNotice(const boost::shared_ptr<LLNotificationForm> form);
 	void adjustPanelForTipNotice();
 
 	// panel elements
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index ef75e060474be19af5908730711abd9f646455da..afb9e261b0f4093b00b1c710a9d142ad66f5a2a1 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -34,6 +34,8 @@
 
 #include "lltoastpanel.h"
 
+#include "llnotifications.h"
+
 //static
 const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32)
 
@@ -46,12 +48,19 @@ LLToastPanel::~LLToastPanel()
 {
 }
 
+//virtual
 std::string LLToastPanel::getTitle()
 {
 	// *TODO: create Title and localize it. If it will be required.
 	return mNotification->getMessage();
 }
 
+//virtual
+const LLUUID& LLToastPanel::getID()
+{
+	return mNotification->id();
+}
+
 //snap to the message height if it is visible
 void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
 {
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index a88127b00800acc6d130f5a33c9c75f5a62c209b..f1dd7d7a867a1f3cd26e99691b12483bfb6321dd 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -35,7 +35,7 @@
 
 #include "llpanel.h"
 #include "lltextbox.h"
-#include "llnotifications.h"
+#include "llnotificationptr.h"
 
 #include <string>
 
@@ -57,7 +57,7 @@ class LLToastPanel: public LLPanel {
 	virtual ~LLToastPanel() = 0;
 
 	virtual std::string getTitle();
-	virtual const LLUUID& getID() { return mNotification->id();}
+	virtual const LLUUID& getID();
 
 	static const S32 MIN_PANEL_HEIGHT;
 protected:
diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp
index 0088a6a2a48a9061982739beadaf3ca8fc237c71..3593064befea7818be48b26b379e411d53f6a244 100644
--- a/indra/newview/lltoolbrush.cpp
+++ b/indra/newview/lltoolbrush.cpp
@@ -35,9 +35,10 @@
 #include "lltoolbrush.h"
 #include "lltoolselectland.h"
 
+// library headers
 #include "llgl.h"
+#include "llnotificationsutil.h"
 #include "llrender.h"
-
 #include "message.h"
 
 #include "llagent.h"
@@ -672,7 +673,7 @@ void LLToolBrushLand::alertNoTerraform(LLViewerRegion* regionp)
 	
 	LLSD args;
 	args["REGION"] = regionp->getName();
-	LLNotifications::instance().add("RegionNoTerraforming", args);
+	LLNotificationsUtil::add("RegionNoTerraforming", args);
 
 }
 
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 0790838d3d2b6c973f1f8f26619662ff3c5c54ea..81dcfb6a4f8b76780961017056af6501296c24b5 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -33,6 +33,9 @@
 #include "llviewerprecompiledheaders.h"
 #include "lltooldraganddrop.h"
 
+// library headers
+#include "llnotificationsutil.h"
+// project headers
 #include "llagent.h"
 #include "llagentui.h"
 #include "llagentwearables.h"
@@ -978,7 +981,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
 		hit_obj->fetchInventoryFromServer();
 		LLSD args;
 		args["ERROR_MESSAGE"] = "Unable to add texture.\nPlease wait a few seconds and try again.";
-		LLNotifications::instance().add("ErrorMessage", args);
+		LLNotificationsUtil::add("ErrorMessage", args);
 		return FALSE;
 	}
 	if (hit_obj->getInventoryItemByAsset(item->getAssetUUID()))
@@ -1431,14 +1434,14 @@ void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
 		LLSD payload;
 		payload["agent_id"] = to_agent;
 		payload["item_id"] = item->getUUID();
-		LLNotifications::instance().add("CannotCopyWarning", LLSD(), payload, 
+		LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload, 
 		        &LLToolDragAndDrop::handleCopyProtectedItem);
 	}
 }
 // static
 bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLInventoryItem* item = NULL;
 	switch(option)
 	{
@@ -1455,12 +1458,12 @@ bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const
 		}
 		else
 		{
-			LLNotifications::instance().add("CannotGiveItem");		
+			LLNotificationsUtil::add("CannotGiveItem");		
 		}
 		break;
 
 	default: // no, cancel, whatever, who cares, not yes.
-		LLNotifications::instance().add("TransactionCancelled");
+		LLNotificationsUtil::add("TransactionCancelled");
 		break;
 	}
 	return false;
@@ -1556,18 +1559,18 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
 	}
 	if(!complete)
 	{
-		LLNotifications::instance().add("IncompleteInventory");
+		LLNotificationsUtil::add("IncompleteInventory");
 		return;
 	}
  	count = items.count() + cats.count();
  	if(count > MAX_ITEMS)
   	{
-		LLNotifications::instance().add("TooManyItems");
+		LLNotificationsUtil::add("TooManyItems");
   		return;
   	}
  	else if(count == 0)
   	{
-		LLNotifications::instance().add("NoItems");
+		LLNotificationsUtil::add("NoItems");
   		return;
   	}
 	else
@@ -1585,7 +1588,7 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
 			LLSD payload;
 			payload["agent_id"] = to_agent;
 			payload["folder_id"] = cat->getUUID();
-			LLNotifications::instance().add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);
+			LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);
 		}
 	}
 }
@@ -1594,7 +1597,7 @@ void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
 // static
 bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLInventoryCategory* cat = NULL;
 	switch(option)
 	{
@@ -1621,12 +1624,12 @@ bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, co
 		}
 		else
 		{
-			LLNotifications::instance().add("CannotGiveCategory");
+			LLNotificationsUtil::add("CannotGiveCategory");
 		}
 		break;
 
 	default: // no, cancel, whatever, who cares, not yes.
-		LLNotifications::instance().add("TransactionCancelled");
+		LLNotificationsUtil::add("TransactionCancelled");
 		break;
 	}
 	return false;
@@ -1661,12 +1664,12 @@ void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent,
  	S32 count = items.count() + cats.count();
  	if(count > MAX_ITEMS)
   	{
-		LLNotifications::instance().add("TooManyItems");
+		LLNotificationsUtil::add("TooManyItems");
   		return;
   	}
  	else if(count == 0)
   	{
-		LLNotifications::instance().add("NoItems");
+		LLNotificationsUtil::add("NoItems");
   		return;
   	}
 	else
@@ -2305,7 +2308,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
 			// destroy clothing items.
 			if (!gAgentWearables.areWearablesLoaded()) 
 			{
-				LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+				LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 				return ACCEPT_NO;
 			}
 
@@ -2400,7 +2403,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
 		// destroy clothing items.
 		if (!gAgentWearables.areWearablesLoaded()) 
 		{
-			LLNotifications::instance().add("CanNotChangeAppearanceUntilLoaded");
+			LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
 			return ACCEPT_NO;
 		}
 	}
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 9e064d81356dd37417fd93d03db6c8309b0fa70f..46618d40268966533287006d1ca198c41af047ec 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -49,6 +49,7 @@
 #include "llworldmapmessage.h"
 
 // library includes
+#include "llnotificationsutil.h"
 #include "llsd.h"
 
 class LLURLDispatcherImpl
@@ -162,7 +163,7 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url,
 	// (but still return true because it is a valid app SLURL)
 	if (! handled)
 	{
-		LLNotifications::instance().add("UnsupportedCommandSLURL");
+		LLNotificationsUtil::add("UnsupportedCommandSLURL");
 	}
 	return true;
 }
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 642df923795c303ab9c4b71afba8e8762f289569..1a8edb1f6abba3ce3856ac94b4d32007fc6f9b20 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -38,6 +38,7 @@
 #include "llviewerfloaterreg.h"
 
 #include "llcompilequeue.h"
+#include "llcallfloater.h"
 #include "llfloaterabout.h"
 #include "llfloateractivespeakers.h"
 #include "llfloateranimpreview.h"
@@ -105,6 +106,7 @@
 #include "llfloateruipreview.h"
 #include "llfloaterurldisplay.h"
 #include "llfloatervoicedevicesettings.h"
+#include "llfloatervolumepulldown.h"
 #include "llfloaterwater.h"
 #include "llfloaterwhitelistentry.h"
 #include "llfloaterwindlight.h"
@@ -174,7 +176,6 @@ void LLViewerFloaterReg::registerFloaters()
 
 	LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
 	LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
-	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
 	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
 	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
 	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
@@ -234,6 +235,7 @@ void LLViewerFloaterReg::registerFloaters()
 	
 	LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);
 	LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>);
+	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
 	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
 	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
 	LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
@@ -247,7 +249,9 @@ void LLViewerFloaterReg::registerFloaters()
 	LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
 	LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
 	
+	LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
 	LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
+	LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
 	
 	LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);	
 	LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);	
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index c6ec25c1cb307a39d64ff64d324680b1e5322e0e..d0ae5d1e381b877955707afc47fc6445e9bf7bfb 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -33,6 +33,7 @@
 #include "llviewerprecompiledheaders.h"
 #include "llviewerinventory.h"
 
+#include "llnotificationsutil.h"
 #include "message.h"
 #include "indra_constants.h"
 
@@ -451,7 +452,7 @@ void LLViewerInventoryCategory::updateServer(BOOL is_new) const
 
 	if (LLFolderType::lookupIsProtectedType(mPreferredType))
 	{
-		LLNotifications::instance().add("CannotModifyProtectedCategories");
+		LLNotificationsUtil::add("CannotModifyProtectedCategories");
 		return;
 	}
 
@@ -475,7 +476,7 @@ void LLViewerInventoryCategory::removeFromServer( void )
 	// communicate that change with the server.
 	if(LLFolderType::lookupIsProtectedType(mPreferredType))
 	{
-		LLNotifications::instance().add("CannotRemoveProtectedCategories");
+		LLNotificationsUtil::add("CannotRemoveProtectedCategories");
 		return;
 	}
 
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 8c41133a3a8636d59451d6f22a5ec9a2bd7472b5..f2ddb0b1f1bb9ae4b07325b284575469e8bee079 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -47,7 +47,7 @@
 #include "llpluginclassmedia.h"
 
 #include "llevent.h"		// LLSimpleListener
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "lluuid.h"
 #include "llkeyboard.h"
 #include "llmutelist.h"
@@ -169,6 +169,12 @@ LOG_CLASS(LLMimeDiscoveryResponder);
 			completeAny(status, "text/html");
 		}
 		else
+		if(status == 404)
+		{
+			// Treat 404s like an html page.
+			completeAny(status, "text/html");
+		}
+		else
 		{
 			llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
 		
@@ -981,7 +987,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
 	LL_WARNS("Plugin") << "plugin intialization failed for mime type: " << media_type << LL_ENDL;
 	LLSD args;
 	args["MIME_TYPE"] = media_type;
-	LLNotifications::instance().add("NoPlugin", args);
+	LLNotificationsUtil::add("NoPlugin", args);
 
 	return NULL;
 }							
@@ -1947,7 +1953,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
 			// TODO: may want a different message for this case?
 			LLSD args;
 			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
-			LLNotifications::instance().add("MediaPluginFailed", args);
+			LLNotificationsUtil::add("MediaPluginFailed", args);
 		}
 		break;
 
@@ -1962,7 +1968,7 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
 			LLSD args;
 			args["PLUGIN"] = LLMIMETypes::implType(mMimeType);
 			// SJB: This is getting called every frame if the plugin fails to load, continuously respawining the alert!
-			//LLNotifications::instance().add("MediaPluginFailed", args);
+			//LLNotificationsUtil::add("MediaPluginFailed", args);
 		}
 		break;
 		
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index fd74c9c2fcad2a2436a15fbe4114bc06a0ad3fea..f639c841e70d00bd1d5fa441ca25ad6b75a81d17 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
 	}
 	else
 	{
-		if(mFocusedImplID.notNull())
-		{
-			if(mMediaControls.get())
-			{
-				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
-				mMediaControls.get()->resetZoomLevel(false);
-			}
-		}
-
 		if(hasFocus())
 		{
 			gFocusMgr.setKeyboardFocus(NULL);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 8bcf2c62815445a9f8b449c8ed73b1514375ca48..4307002980f925d7664b3fda127ab2152cc01c1b 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -51,6 +51,8 @@
 #include "llfontgl.h"
 #include "llinstantmessage.h"
 #include "llinventorypanel.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llpermissionsflags.h"
 #include "llrect.h"
 #include "llsecondlifeurls.h"
@@ -2938,7 +2940,7 @@ class LLAvatarReportAbuse : public view_listener_t
 bool callback_freeze(const LLSD& notification, const LLSD& response)
 {
 	LLUUID avatar_id = notification["payload"]["avatar_id"].asUUID();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (0 == option || 1 == option)
 	{
@@ -2992,14 +2994,14 @@ void handle_avatar_freeze(const LLSD& avatar_id)
 			{
 				LLSD args;
 				args["AVATAR_NAME"] = fullname;
-				LLNotifications::instance().add("FreezeAvatarFullname",
+				LLNotificationsUtil::add("FreezeAvatarFullname",
 							args,
 							payload,
 							callback_freeze);
 			}
 			else
 			{
-				LLNotifications::instance().add("FreezeAvatar",
+				LLNotificationsUtil::add("FreezeAvatar",
 							LLSD(),
 							payload,
 							callback_freeze);
@@ -3039,7 +3041,7 @@ class LLAvatarDebug : public view_listener_t
 
 bool callback_eject(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (2 == option)
 	{
 		// Cancel button.
@@ -3121,14 +3123,14 @@ void handle_avatar_eject(const LLSD& avatar_id)
 				{
     				LLSD args;
     				args["AVATAR_NAME"] = fullname;
-    				LLNotifications::instance().add("EjectAvatarFullname",
+    				LLNotificationsUtil::add("EjectAvatarFullname",
     							args,
     							payload,
     							callback_eject);
 				}
 				else
 				{
-    				LLNotifications::instance().add("EjectAvatarFullname",
+    				LLNotificationsUtil::add("EjectAvatarFullname",
     							LLSD(),
     							payload,
     							callback_eject);
@@ -3141,14 +3143,14 @@ void handle_avatar_eject(const LLSD& avatar_id)
 				{
     				LLSD args;
     				args["AVATAR_NAME"] = fullname;
-    				LLNotifications::instance().add("EjectAvatarFullnameNoBan",
+    				LLNotificationsUtil::add("EjectAvatarFullnameNoBan",
     							args,
     							payload,
     							callback_eject);
 				}
 				else
 				{
-    				LLNotifications::instance().add("EjectAvatarNoBan",
+    				LLNotificationsUtil::add("EjectAvatarNoBan",
     							LLSD(),
     							payload,
     							callback_eject);
@@ -3231,11 +3233,11 @@ class LLAvatarGiveCard : public view_listener_t
 				transaction_id.generate();
 				msg->addUUIDFast(_PREHASH_TransactionID, transaction_id);
 				msg->sendReliable(dest_host);
-				LLNotifications::instance().add("OfferedCard", args);
+				LLNotificationsUtil::add("OfferedCard", args);
 			}
 			else
 			{
-				LLNotifications::instance().add("CantOfferCallingCard", old_args);
+				LLNotificationsUtil::add("CantOfferCallingCard", old_args);
 			}
 		}
 		return true;
@@ -3254,7 +3256,7 @@ void login_done(S32 which, void *user)
 
 bool callback_leave_group(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		LLMessageSystem *msg = gMessageSystem;
@@ -3321,7 +3323,7 @@ void handle_buy_object(LLSaleInfo sale_info)
 {
 	if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
 	{
-		LLNotifications::instance().add("UnableToBuyWhileDownloading");
+		LLNotificationsUtil::add("UnableToBuyWhileDownloading");
 		return;
 	}
 
@@ -3330,7 +3332,7 @@ void handle_buy_object(LLSaleInfo sale_info)
 	BOOL owners_identical = LLSelectMgr::getInstance()->selectGetOwner(owner_id, owner_name);
 	if (!owners_identical)
 	{
-		LLNotifications::instance().add("CannotBuyObjectsFromDifferentOwners");
+		LLNotificationsUtil::add("CannotBuyObjectsFromDifferentOwners");
 		return;
 	}
 
@@ -3340,7 +3342,7 @@ void handle_buy_object(LLSaleInfo sale_info)
 	valid &= LLSelectMgr::getInstance()->selectGetAggregatePermissions(ag_perm);
 	if(!valid || !sale_info.isForSale() || !perm.allowTransferTo(gAgent.getID()))
 	{
-		LLNotifications::instance().add("ObjectNotForSale");
+		LLNotificationsUtil::add("ObjectNotForSale");
 		return;
 	}
 
@@ -3504,12 +3506,12 @@ void set_god_level(U8 god_level)
 	if(god_level > GOD_NOT)
 	{
 		args["LEVEL"] = llformat("%d",(S32)god_level);
-		LLNotifications::instance().add("EnteringGodMode", args);
+		LLNotificationsUtil::add("EnteringGodMode", args);
 	}
 	else
 	{
 		args["LEVEL"] = llformat("%d",(S32)old_god_level);
-		LLNotifications::instance().add("LeavingGodMode", args);
+		LLNotificationsUtil::add("LeavingGodMode", args);
 	}
 
 	// changing god-level can affect which menus we see
@@ -3630,7 +3632,7 @@ void request_friendship(const LLUUID& dest_id)
 		}
 		else
 		{
-			LLNotifications::instance().add("CantOfferFriendship");
+			LLNotificationsUtil::add("CantOfferFriendship");
 		}
 	}
 }
@@ -3961,7 +3963,7 @@ void handle_claim_public_land(void*)
 {
 	if (LLViewerParcelMgr::getInstance()->getSelectionRegion() != gAgent.getRegion())
 	{
-		LLNotifications::instance().add("ClaimPublicLand");
+		LLNotificationsUtil::add("ClaimPublicLand");
 		return;
 	}
 
@@ -4157,7 +4159,7 @@ void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
 	}
 	else if(!error.empty())
 	{
-		LLNotifications::instance().add(error);
+		LLNotificationsUtil::add(error);
 	}
 }
 
@@ -4178,13 +4180,13 @@ class LLObjectReturn : public view_listener_t
 		
 		mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
 
-		LLNotifications::instance().add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
+		LLNotificationsUtil::add("ReturnToOwner", LLSD(), LLSD(), boost::bind(&LLObjectReturn::onReturnToOwner, this, _1, _2));
 		return true;
 	}
 
 	bool onReturnToOwner(const LLSD& notification, const LLSD& response)
 	{
-		S32 option = LLNotification::getSelectedOption(notification, response);
+		S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 		if (0 == option)
 		{
 			// Ignore category ID for this derez destination.
@@ -4361,7 +4363,7 @@ void handle_take()
 
 bool confirm_take(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(enable_take() && (option == 0))
 	{
 		derez_objects(DRD_TAKE_INTO_AGENT_INVENTORY, notification["payload"]["folder_id"].asUUID());
@@ -4536,7 +4538,7 @@ S32 selection_price()
 /*
 bool callback_show_buy_currency(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		llinfos << "Loading page " << LLNotifications::instance().getGlobalString("BUY_CURRENCY_URL") << llendl;
@@ -4562,7 +4564,7 @@ void show_buy_currency(const char* extra)
 	{
 		args["EXTRA"] = extra;
 	}
-	LLNotifications::instance().add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency);
+	LLNotificationsUtil::add("PromptGoToCurrencyPage", args);//, LLSD(), callback_show_buy_currency);
 }
 
 void handle_buy()
@@ -4832,7 +4834,7 @@ class LLToolsLink : public view_listener_t
 	{
 		if(!LLSelectMgr::getInstance()->selectGetAllRootsValid())
 		{
-			LLNotifications::instance().add("UnableToLinkWhileDownloading");
+			LLNotificationsUtil::add("UnableToLinkWhileDownloading");
 			return true;
 		}
 
@@ -4843,18 +4845,18 @@ class LLToolsLink : public view_listener_t
 			args["COUNT"] = llformat("%d", object_count);
 			int max = MAX_CHILDREN_PER_TASK+1;
 			args["MAX"] = llformat("%d", max);
-			LLNotifications::instance().add("UnableToLinkObjects", args);
+			LLNotificationsUtil::add("UnableToLinkObjects", args);
 			return true;
 		}
 
 		if(LLSelectMgr::getInstance()->getSelection()->getRootObjectCount() < 2)
 		{
-			LLNotifications::instance().add("CannotLinkIncompleteSet");
+			LLNotificationsUtil::add("CannotLinkIncompleteSet");
 			return true;
 		}
 		if(!LLSelectMgr::getInstance()->selectGetRootsModify())
 		{
-			LLNotifications::instance().add("CannotLinkModify");
+			LLNotificationsUtil::add("CannotLinkModify");
 			return true;
 		}
 		LLUUID owner_id;
@@ -4864,7 +4866,7 @@ class LLToolsLink : public view_listener_t
 			// we don't actually care if you're the owner, but novices are
 			// the most likely to be stumped by this one, so offer the
 			// easiest and most likely solution.
-			LLNotifications::instance().add("CannotLinkDifferentOwners");
+			LLNotificationsUtil::add("CannotLinkDifferentOwners");
 			return true;
 		}
 		LLSelectMgr::getInstance()->sendLink();
@@ -5348,7 +5350,7 @@ class LLWorldSetBusy : public view_listener_t
 		else
 		{
 			gAgent.setBusy();
-			LLNotifications::instance().add("BusyModeSet");
+			LLNotificationsUtil::add("BusyModeSet");
 		}
 		return true;
 	}
@@ -5464,7 +5466,7 @@ class LLAvatarAddContact : public view_listener_t
 
 bool complete_give_money(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle selection)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		gAgent.clearBusy();
@@ -5626,12 +5628,7 @@ class LLShowFloater : public view_listener_t
 		}
 		else if (floater_name == "buy land")
 		{
-			if (LLViewerParcelMgr::getInstance()->selectionEmpty())
-			{
-				LLViewerParcelMgr::getInstance()->selectParcelAt(gAgent.getPositionGlobal());
-			}
-			
-			LLViewerParcelMgr::getInstance()->startBuyLand();
+			handle_buy_land();
 		}
 		else if (floater_name == "script errors")
 		{
@@ -5690,7 +5687,7 @@ class LLShowSidetrayPanel : public view_listener_t
 
 bool callback_show_url(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LLWeb::loadURL(notification["payload"]["url"].asString());
@@ -5713,7 +5710,7 @@ class LLPromptShowURL : public view_listener_t
 			{ 
     			LLSD payload;
     			payload["url"] = url;
-    			LLNotifications::instance().add(alert, LLSD(), payload, callback_show_url);
+    			LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_url);
 			}
 			else
 			{
@@ -5730,7 +5727,7 @@ class LLPromptShowURL : public view_listener_t
 
 bool callback_show_file(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LLWeb::loadURL(notification["payload"]["url"]);
@@ -5751,7 +5748,7 @@ class LLPromptShowFile : public view_listener_t
 
 			LLSD payload;
 			payload["url"] = file;
-			LLNotifications::instance().add(alert, LLSD(), payload, callback_show_file);
+			LLNotificationsUtil::add(alert, LLSD(), payload, callback_show_file);
 		}
 		else
 		{
@@ -5841,7 +5838,15 @@ BOOL enable_buy_land(void*)
 				LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel(), false);
 }
 
-
+void handle_buy_land()
+{
+	LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+	if (vpm->selectionEmpty())
+	{
+		vpm->selectParcelAt(gAgent.getPositionGlobal());
+	}
+	vpm->startBuyLand();
+}
 
 class LLObjectAttachToAvatar : public view_listener_t
 {
@@ -6322,12 +6327,12 @@ void queue_actions(LLFloaterScriptQueue* q, const std::string& msg)
 		if ( !func.scripted )
 		{
 			std::string noscriptmsg = std::string("Cannot") + msg + "SelectObjectsNoScripts";
-			LLNotifications::instance().add(noscriptmsg);
+			LLNotificationsUtil::add(noscriptmsg);
 		}
 		else if ( !func.modifiable )
 		{
 			std::string nomodmsg = std::string("Cannot") + msg + "SelectObjectsNoPermission";
-			LLNotifications::instance().add(nomodmsg);
+			LLNotificationsUtil::add(nomodmsg);
 		}
 		else
 		{
@@ -7136,7 +7141,7 @@ void handle_save_to_xml(void*)
 	LLFloater* frontmost = gFloaterView->getFrontmost();
 	if (!frontmost)
 	{
-        LLNotifications::instance().add("NoFrontmostFloater");
+        LLNotificationsUtil::add("NoFrontmostFloater");
 		return;
 	}
 
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index 9a6fe03f9fa3baee3d46c29bc629fda12dbc6745..01a6b341707bb4f28a85a63924d0c2943d497f59 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -102,6 +102,8 @@ void handle_take_copy();
 void handle_look_at_selection(const LLSD& param);
 void handle_zoom_to_object(LLUUID object_id);
 
+void handle_buy_land();
+
 // Takes avatar UUID, or if no UUID passed, uses last selected object
 void handle_avatar_freeze(const LLSD& avatar_id);
 
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 753acab172b84a21d8e16eba388516ef52855bf1..4b0dc8f668b4cbeeba39c186b10d444d562f11b7 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -61,6 +61,7 @@
 #include "llassetuploadresponders.h"
 #include "lleconomy.h"
 #include "llhttpclient.h"
+#include "llnotificationsutil.h"
 #include "llsdserialize.h"
 #include "llstring.h"
 #include "lltransactiontypes.h"
@@ -175,7 +176,7 @@ const std::string upload_pick(void* data)
 		// No extension
 		LLSD args;
 		args["FILE"] = short_name;
-		LLNotifications::instance().add("NoFileExtension", args);
+		LLNotificationsUtil::add("NoFileExtension", args);
 		return std::string();
 	}
 	else
@@ -218,7 +219,7 @@ const std::string upload_pick(void* data)
 			LLSD args;
 			args["EXTENSION"] = ext;
 			args["VALIDS"] = valid_extensions;
-			LLNotifications::instance().add("InvalidFileExtension", args);
+			LLNotificationsUtil::add("InvalidFileExtension", args);
 			return std::string();
 		}
 	}//end else (non-null extension)
@@ -236,7 +237,7 @@ const std::string upload_pick(void* data)
 			llinfos << error_msg << ": " << filename << llendl;
 			LLSD args;
 			args["FILE"] = filename;
-			LLNotifications::instance().add( error_msg, args );
+			LLNotificationsUtil::add( error_msg, args );
 			return std::string();
 		}
 	}//end if a wave/sound file
@@ -338,7 +339,7 @@ class LLFileUploadBulk : public view_listener_t
 void upload_error(const std::string& error_message, const std::string& label, const std::string& filename, const LLSD& args) 
 {
 	llwarns << error_message << llendl;
-	LLNotifications::instance().add(label, args);
+	LLNotificationsUtil::add(label, args);
 	if(LLFile::remove(filename) == -1)
 	{
 		lldebugs << "unable to remove temp file" << llendl;
@@ -792,7 +793,7 @@ void upload_new_resource(const std::string& src_filename, std::string name,
 		llwarns << error_message << llendl;
 		LLSD args;
 		args["ERROR_MESSAGE"] = error_message;
-		LLNotifications::instance().add("ErrorMessage", args);
+		LLNotificationsUtil::add("ErrorMessage", args);
 		if(LLFile::remove(filename) == -1)
 		{
 			lldebugs << "unable to remove temp file" << llendl;
@@ -881,7 +882,7 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
 		LLSD args;
 		args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
 		args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
-		LLNotifications::instance().add("CannotUploadReason", args);
+		LLNotificationsUtil::add("CannotUploadReason", args);
 	}
 
 	LLUploadDialog::modalUploadFinished();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index adad06dc6f1b52e5b260ff2ce4dffe4b71765a13..9fc818e1ff9e2984b85f8723fc3f48cfd9476dea 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -97,6 +97,7 @@
 #include "llmutelist.h"
 #include "llnearbychat.h"
 #include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llpanelgrouplandmoney.h"
 #include "llpanelplaces.h"
@@ -210,7 +211,7 @@ const BOOL SCRIPT_QUESTION_IS_CAUTION[SCRIPT_PERMISSION_EOF] =
 
 bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLMessageSystem* msg = gMessageSystem;
 	const LLSD& payload = notification["payload"];
 
@@ -635,7 +636,7 @@ void send_sound_trigger(const LLUUID& sound_id, F32 gain)
 
 bool join_group_response(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	BOOL delete_context_data = TRUE;
 	bool accept_invite = false;
 
@@ -650,7 +651,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
 		LLGroupActions::show(group_id);
 		LLSD args;
 		args["MESSAGE"] = message;
-		LLNotifications::instance().add("JoinGroup", args, notification["payload"]);
+		LLNotificationsUtil::add("JoinGroup", args, notification["payload"]);
 		return false;
 	}
 	if(option == 0 && !group_id.isNull())
@@ -669,7 +670,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
 			LLSD args;
 			args["NAME"] = name;
 			args["INVITE"] = message;
-			LLNotifications::instance().add("JoinedTooManyGroupsMember", args, notification["payload"]);
+			LLNotificationsUtil::add("JoinedTooManyGroupsMember", args, notification["payload"]);
 		}
 	}
 
@@ -686,7 +687,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
 			// asking about a fee.
 			LLSD next_payload = notification["payload"];
 			next_payload["fee"] = 0;
-			LLNotifications::instance().add("JoinGroupCanAfford",
+			LLNotificationsUtil::add("JoinGroupCanAfford",
 									args,
 									next_payload);
 		}
@@ -912,7 +913,7 @@ void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& f
 					LLSD args;
 					args["LANDMARK_NAME"] = item->getName();
 					args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
-					LLNotifications::instance().add("LandmarkCreated", args);
+					LLNotificationsUtil::add("LandmarkCreated", args);
 
 					// Created landmark is passed to Places panel to allow its editing.
 					LLPanelPlaces *panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->showPanel("panel_places", LLSD()));
@@ -1108,7 +1109,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
 {
 	LLChat chat;
 	std::string log_message;
-	S32 button = LLNotification::getSelectedOption(notification, response);
+	S32 button = LLNotificationsUtil::getSelectedOption(notification, response);
 	
 	LLInventoryObserver* opener = NULL;
 	LLViewerInventoryCategory* catp = NULL;
@@ -1556,7 +1557,7 @@ bool lure_callback(const LLSD& notification, const LLSD& response)
 	}
 	else
 	{
-		option = LLNotification::getSelectedOption(notification, response);
+		option = LLNotificationsUtil::getSelectedOption(notification, response);
 	}
 	
 	LLUUID from_id = notification["payload"]["from_id"].asUUID();
@@ -1587,7 +1588,7 @@ static LLNotificationFunctorRegistration lure_callback_reg("TeleportOffered", lu
 bool goto_url_callback(const LLSD& notification, const LLSD& response)
 {
 	std::string url = notification["payload"]["url"].asString();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(1 == option)
 	{
 		LLWeb::loadURL(url);
@@ -1598,7 +1599,7 @@ static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_u
 
 bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (0 == option)
 	{
 		LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]);
@@ -1686,7 +1687,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 
 		// Note: don't put the message in the IM history, even though was sent
 		// via the IM mechanism.
-		LLNotifications::instance().add("SystemMessageTip",args);
+		LLNotificationsUtil::add("SystemMessageTip",args);
 		break;
 
 	case IM_NOTHING_SPECIAL: 
@@ -1758,7 +1759,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			// Message to everyone from GOD
 			args["NAME"] = name;
 			args["MESSAGE"] = message;
-			LLNotifications::instance().add("GodMessage", args);
+			LLNotificationsUtil::add("GodMessage", args);
 
 			// Treat like a system message and put in chat history.
 			// Claim to be from a local agent so it doesn't go into
@@ -1837,7 +1838,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			// This is a block, modeless dialog.
 			//*TODO: Translate
 			args["MESSAGE"] = message;
-			LLNotifications::instance().add("SystemMessage", args);
+			LLNotificationsUtil::add("SystemMessage", args);
 		}
 		break;
 	case IM_GROUP_NOTICE:
@@ -1970,7 +1971,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 
 				LLSD args;
 				args["MESSAGE"] = message;
-				LLNotifications::instance().add("JoinGroup", args, payload, join_group_response);
+				LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response);
 			}
 		}
 		break;
@@ -2047,13 +2048,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 	case IM_INVENTORY_ACCEPTED:
 	{
 		args["NAME"] = name;
-		LLNotifications::instance().add("InventoryAccepted", args);
+		LLNotificationsUtil::add("InventoryAccepted", args);
 		break;
 	}
 	case IM_INVENTORY_DECLINED:
 	{
 		args["NAME"] = name;
-		LLNotifications::instance().add("InventoryDeclined", args);
+		LLNotificationsUtil::add("InventoryDeclined", args);
 		break;
 	}
 	// TODO: _DEPRECATED suffix as part of vote removal - DEV-24856
@@ -2135,7 +2136,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			{
 				payload["groupowned"] = "true";
 			}
-			LLNotifications::instance().add("ServerObjectMessage", substitutions, payload);
+			LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);
 		}
 		break;
 	case IM_FROM_TASK_AS_ALERT:
@@ -2147,7 +2148,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			// Construct a viewer alert for this message.
 			args["NAME"] = name;
 			args["MESSAGE"] = message;
-			LLNotifications::instance().add("ObjectMessage", args);
+			LLNotificationsUtil::add("ObjectMessage", args);
 		}
 		break;
 	case IM_BUSY_AUTO_RESPONSE:
@@ -2184,7 +2185,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				payload["from_id"] = from_id;
 				payload["lure_id"] = session_id;
 				payload["godlike"] = FALSE;
-				LLNotifications::instance().add("TeleportOffered", args, payload);
+				LLNotificationsUtil::add("TeleportOffered", args, payload);
 			}
 		}
 		break;
@@ -2221,7 +2222,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			args["URL"] = url;
 			LLSD payload;
 			payload["url"] = url;
-			LLNotifications::instance().add("GotoURL", args, payload );
+			LLNotificationsUtil::add("GotoURL", args, payload );
 		}
 		break;
 
@@ -2248,12 +2249,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 				if(message.empty())
 				{
 					//support for frienship offers from clients before July 2008
-				        LLNotifications::instance().add("OfferFriendshipNoMessage", args, payload);
+				        LLNotificationsUtil::add("OfferFriendshipNoMessage", args, payload);
 				}
 				else
 				{
 					args["[MESSAGE]"] = message;
-				        LLNotifications::instance().add("OfferFriendship", args, payload);
+				        LLNotificationsUtil::add("OfferFriendship", args, payload);
 				}
 			}
 		}
@@ -2273,7 +2274,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
 			args["NAME"] = name;
 			LLSD payload;
 			payload["from_id"] = from_id;
-			LLNotifications::instance().add("FriendshipAccepted", args, payload);
+			LLNotificationsUtil::add("FriendshipAccepted", args, payload);
 		}
 		break;
 
@@ -2314,7 +2315,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)
 
 bool callingcard_offer_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLUUID fid;
 	LLUUID from_id;
 	LLMessageSystem* msg = gMessageSystem;
@@ -2393,7 +2394,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
 		}
 		else
 		{
-			LLNotifications::instance().add("OfferCallingCard", args, payload);
+			LLNotificationsUtil::add("OfferCallingCard", args, payload);
 		}
 	}
 	else
@@ -2404,12 +2405,12 @@ void process_offer_callingcard(LLMessageSystem* msg, void**)
 
 void process_accept_callingcard(LLMessageSystem* msg, void**)
 {
-	LLNotifications::instance().add("CallingCardAccepted");
+	LLNotificationsUtil::add("CallingCardAccepted");
 }
 
 void process_decline_callingcard(LLMessageSystem* msg, void**)
 {
-	LLNotifications::instance().add("CallingCardDeclined");
+	LLNotificationsUtil::add("CallingCardDeclined");
 }
 
 
@@ -2744,13 +2745,13 @@ class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver
 		{	// Show notification that they can now teleport to landmarks.  Use a random landmark from the inventory
 			S32 random_land = ll_rand( land_items.count() - 1 );
 			args["NAME"] = land_items[random_land]->getName();
-			LLNotifications::instance().add("TeleportToLandmark",args);
+			LLNotificationsUtil::add("TeleportToLandmark",args);
 		}
 		if ( card_items.count() > 0 )
 		{	// Show notification that they can now contact people.  Use a random calling card from the inventory
 			S32 random_card = ll_rand( card_items.count() - 1 );
 			args["NAME"] = card_items[random_card]->getName();
-			LLNotifications::instance().add("TeleportToPerson",args);
+			LLNotificationsUtil::add("TeleportToPerson",args);
 		}
 
 		gInventory.removeObserver(this);
@@ -3127,7 +3128,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
 
 		LLSD args;
 		args["URL"] = url;
-		LLNotifications::instance().add("ServerVersionChanged", args);
+		LLNotificationsUtil::add("ServerVersionChanged", args);
 	}
 
 	gLastVersionChannel = version_channel;
@@ -4346,7 +4347,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
 		// *TODO: Translate
 		LLSD args;
 		args["MESSAGE"] = desc;
-		LLNotifications::instance().add("SystemMessage", args);
+		LLNotificationsUtil::add("SystemMessage", args);
 
 		// Once the 'recent' container gets large enough, chop some
 		// off the beginning.
@@ -4364,7 +4365,7 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
 
 bool handle_special_notification_callback(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	
 	if (0 == option)
 	{
@@ -4385,18 +4386,18 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
 	llsdBlock["REGIONMATURITY"] = LLViewerRegion::accessToString(regionAccess);
 	
 	// we're going to throw the LLSD in there in case anyone ever wants to use it
-	LLNotifications::instance().add(notificationID+"_Notify", llsdBlock);
+	LLNotificationsUtil::add(notificationID+"_Notify", llsdBlock);
 	
 	if (regionAccess == SIM_ACCESS_MATURE)
 	{
 		if (gAgent.isTeen())
 		{
-			LLNotifications::instance().add(notificationID+"_KB", llsdBlock);
+			LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
 			return true;
 		}
 		else if (gAgent.prefersPG())
 		{
-			LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
+			LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
 			return true;
 		}
 	}
@@ -4404,12 +4405,12 @@ bool handle_special_notification(std::string notificationID, LLSD& llsdBlock)
 	{
 		if (!gAgent.isAdult())
 		{
-			LLNotifications::instance().add(notificationID+"_KB", llsdBlock);
+			LLNotificationsUtil::add(notificationID+"_KB", llsdBlock);
 			return true;
 		}
 		else if (gAgent.prefersPG() || gAgent.prefersMature())
 		{
-			LLNotifications::instance().add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
+			LLNotificationsUtil::add(notificationID+"_Change", llsdBlock, llsdBlock, handle_special_notification_callback);
 			return true;
 		}
 	}
@@ -4469,7 +4470,7 @@ bool attempt_standard_notification(LLMessageSystem* msgsystem)
 			}
 		}
 		
-		LLNotifications::instance().add(notificationID, llsdBlock);
+		LLNotificationsUtil::add(notificationID, llsdBlock);
 		return true;
 	}	
 	return false;
@@ -4535,14 +4536,14 @@ void process_alert_core(const std::string& message, BOOL modal)
 		// Allow the server to spawn a named alert so that server alerts can be
 		// translated out of English.
 		std::string alert_name(message.substr(ALERT_PREFIX.length()));
-		LLNotifications::instance().add(alert_name);
+		LLNotificationsUtil::add(alert_name);
 	}
 	else if (message.find(NOTIFY_PREFIX) == 0)
 	{
 		// Allow the server to spawn a named notification so that server notifications can be
 		// translated out of English.
 		std::string notify_name(message.substr(NOTIFY_PREFIX.length()));
-		LLNotifications::instance().add(notify_name);
+		LLNotificationsUtil::add(notify_name);
 	}
 	else if (message[0] == '/')
 	{
@@ -4554,20 +4555,20 @@ void process_alert_core(const std::string& message, BOOL modal)
 			S32 mins = 0;
 			LLStringUtil::convertToS32(text.substr(18), mins);
 			args["MINUTES"] = llformat("%d",mins);
-			LLNotifications::instance().add("RegionRestartMinutes", args);
+			LLNotificationsUtil::add("RegionRestartMinutes", args);
 		}
 		else if (text.substr(0,17) == "RESTART_X_SECONDS")
 		{
 			S32 secs = 0;
 			LLStringUtil::convertToS32(text.substr(18), secs);
 			args["SECONDS"] = llformat("%d",secs);
-			LLNotifications::instance().add("RegionRestartSeconds", args);
+			LLNotificationsUtil::add("RegionRestartSeconds", args);
 		}
 		else
 		{
 			std::string new_msg =LLNotifications::instance().getGlobalString(text);
 			args["MESSAGE"] = new_msg;
-			LLNotifications::instance().add("SystemMessage", args);
+			LLNotificationsUtil::add("SystemMessage", args);
 		}
 	}
 	else if (modal)
@@ -4575,14 +4576,14 @@ void process_alert_core(const std::string& message, BOOL modal)
 		LLSD args;
 		std::string new_msg =LLNotifications::instance().getGlobalString(message);
 		args["ERROR_MESSAGE"] = new_msg;
-		LLNotifications::instance().add("ErrorMessage", args);
+		LLNotificationsUtil::add("ErrorMessage", args);
 	}
 	else
 	{
 		LLSD args;
 		std::string new_msg =LLNotifications::instance().getGlobalString(message);
 		args["MESSAGE"] = new_msg;
-		LLNotifications::instance().add("SystemMessageTip", args);
+		LLNotificationsUtil::add("SystemMessageTip", args);
 	}
 }
 
@@ -4798,7 +4799,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
 
 bool script_question_cb(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLMessageSystem *msg = gMessageSystem;
 	S32 orig = notification["payload"]["questions"].asInteger();
 	S32 new_questions = orig;
@@ -4862,10 +4863,10 @@ bool script_question_cb(const LLSD& notification, const LLSD& response)
 	if (response["Details"])
 	{
 		// respawn notification...
-		LLNotifications::instance().add(notification["name"], notification["substitutions"], notification["payload"]);
+		LLNotificationsUtil::add(notification["name"], notification["substitutions"], notification["payload"]);
 
 		// ...with description on top
-		LLNotifications::instance().add("DebitPermissionDetails");
+		LLNotificationsUtil::add("DebitPermissionDetails");
 	}
 	return false;
 }
@@ -4962,12 +4963,12 @@ void process_script_question(LLMessageSystem *msg, void **user_data)
 		if (gSavedSettings.getBOOL("PermissionsCautionEnabled"))
 		{
 			// display the caution permissions prompt
-			LLNotifications::instance().add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
+			LLNotificationsUtil::add(caution ? "ScriptQuestionCaution" : "ScriptQuestion", args, payload);
 		}
 		else
 		{
 			// fall back to default behavior if cautions are entirely disabled
-			LLNotifications::instance().add("ScriptQuestion", args, payload);
+			LLNotificationsUtil::add("ScriptQuestion", args, payload);
 		}
 
 	}
@@ -5167,7 +5168,7 @@ void process_teleport_failed(LLMessageSystem *msg, void**)
 		}
 	}
 
-	LLNotifications::instance().add("CouldNotTeleportReason", args);
+	LLNotificationsUtil::add("CouldNotTeleportReason", args);
 
 	// Let the interested parties know that teleport failed.
 	LLViewerParcelMgr::getInstance()->onTeleportFailed();
@@ -5300,7 +5301,7 @@ void send_group_notice(const LLUUID& group_id,
 bool handle_lure_callback(const LLSD& notification, const LLSD& response)
 {
 	std::string text = response["message"].asString();
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if(0 == option)
 	{
@@ -5347,11 +5348,11 @@ void handle_lure(const std::vector<LLUUID>& ids)
 	}
 	if (gAgent.isGodlike())
 	{
-		LLNotifications::instance().add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);
+		LLNotificationsUtil::add("OfferTeleportFromGod", edit_args, payload, handle_lure_callback);
 	}
 	else
 	{
-		LLNotifications::instance().add("OfferTeleport", edit_args, payload, handle_lure_callback);
+		LLNotificationsUtil::add("OfferTeleport", edit_args, payload, handle_lure_callback);
 	}
 }
 
@@ -5555,7 +5556,7 @@ std::vector<LLSD> gLoadUrlList;
 
 bool callback_load_url(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 
 	if (0 == option)
 	{
@@ -5600,7 +5601,7 @@ void callback_load_url_name(const LLUUID& id, const std::string& first, const st
 			args["OBJECTNAME"] = load_url_info["object_name"].asString();
 			args["NAME"] = owner_name;
 
-			LLNotifications::instance().add("LoadWebPage", args, load_url_info);
+			LLNotificationsUtil::add("LoadWebPage", args, load_url_info);
 		}
 		else
 		{
@@ -5655,7 +5656,7 @@ void callback_download_complete(void** data, S32 result, LLExtStat ext_status)
 	std::string* filepath = (std::string*)data;
 	LLSD args;
 	args["DOWNLOAD_PATH"] = *filepath;
-	LLNotifications::instance().add("FinishedRawDownload", args);
+	LLNotificationsUtil::add("FinishedRawDownload", args);
 	delete filepath;
 }
 
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index f61dbb1b391e87d9893969a5cbcb8cabd42004a5..90a7ee98b924ec70b01428fb7648eda931b5bc0c 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -43,7 +43,7 @@
 #include "message.h"
 #include "llviewermediafocus.h"
 #include "llviewerparcelmediaautoplay.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llfirstuse.h"
 #include "llpluginclassmedia.h"
 #include "llviewertexture.h"
@@ -111,7 +111,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 			// First use warning
 			if(	! mediaUrl.empty() && gWarningSettings.getBOOL("FirstStreamingVideo") )
 			{
-				LLNotifications::instance().add("ParcelCanPlayMedia", LLSD(), LLSD(),
+				LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
 					boost::bind(callback_play_media, _1, _2, parcel));
 				return;
 
@@ -167,7 +167,7 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
 				{
 					gWarningSettings.setBOOL("QuickTimeInstalled", FALSE);
 
-					LLNotifications::instance().add("NoQuickTime" );
+					LLNotificationsUtil::add("NoQuickTime" );
 				};
 			}
 		}
@@ -590,7 +590,7 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent
 
 bool callback_play_media(const LLSD& notification, const LLSD& response, LLParcel* parcel)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		gSavedSettings.setBOOL("AudioStreamingVideo", TRUE);
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index fcaf49c88493951764f08045512741d3a067e395..2fae78cdfb6aa2ad82a056eb378b716877cf5c94 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -39,6 +39,8 @@
 #include "indra_constants.h"
 #include "llcachename.h"
 #include "llgl.h"
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llparcel.h"
 #include "llsecondlifeurls.h"
 #include "message.h"
@@ -520,7 +522,7 @@ LLParcelSelectionHandle LLViewerParcelMgr::selectLand(const LLVector3d &corner1,
 
 	if (region != region_other)
 	{
-		LLNotifications::instance().add("CantSelectLandFromMultipleRegions");
+		LLNotificationsUtil::add("CantSelectLandFromMultipleRegions");
 		mSelected = FALSE;
 		notifyObservers();
 		return NULL;
@@ -943,7 +945,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 {
 	if (!mSelected)
 	{
-		LLNotifications::instance().add("CannotSetLandOwnerNothingSelected");
+		LLNotificationsUtil::add("CannotSetLandOwnerNothingSelected");
 		return;
 	}
 
@@ -958,7 +960,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 	if (!region)
 	{
 		// TODO: Add a force owner version of this alert.
-		LLNotifications::instance().add("CannotContentifyNoRegion");
+		LLNotificationsUtil::add("CannotContentifyNoRegion");
 		return;
 	}
 
@@ -966,7 +968,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 	LLViewerRegion *region2 = LLWorld::getInstance()->getRegionFromPosGlobal( east_north_region_check );
 	if (region != region2)
 	{
-		LLNotifications::instance().add("CannotSetLandOwnerMultipleRegions");
+		LLNotificationsUtil::add("CannotSetLandOwnerMultipleRegions");
 		return;
 	}
 
@@ -991,7 +993,7 @@ void LLViewerParcelMgr::sendParcelGodForceOwner(const LLUUID& owner_id)
 
 bool callback_god_force_owner(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if(0 == option)
 	{
 		LLMessageSystem* msg = gMessageSystem;
@@ -1011,13 +1013,13 @@ void LLViewerParcelMgr::sendParcelGodForceToContent()
 {
 	if (!mSelected)
 	{
-		LLNotifications::instance().add("CannotContentifyNothingSelected");
+		LLNotificationsUtil::add("CannotContentifyNothingSelected");
 		return;
 	}
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotContentifyNoRegion");
+		LLNotificationsUtil::add("CannotContentifyNoRegion");
 		return;
 	}
 
@@ -1035,14 +1037,14 @@ void LLViewerParcelMgr::sendParcelRelease()
 {
 	if (!mSelected)
 	{
-        LLNotifications::instance().add("CannotReleaseLandNothingSelected");
+        LLNotificationsUtil::add("CannotReleaseLandNothingSelected");
 		return;
 	}
 
 	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotReleaseLandNoRegion");
+		LLNotificationsUtil::add("CannotReleaseLandNoRegion");
 		return;
 	}
 
@@ -1097,14 +1099,14 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
 {
 	if (!mSelected || !mCurrentParcel)
 	{
-		LLNotifications::instance().add("CannotBuyLandNothingSelected");
+		LLNotificationsUtil::add("CannotBuyLandNothingSelected");
 		return NULL;
 	}
 
 	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotBuyLandNoRegion");
+		LLNotificationsUtil::add("CannotBuyLandNoRegion");
 		return NULL;
 	}
 	
@@ -1122,7 +1124,7 @@ LLViewerParcelMgr::ParcelBuyInfo* LLViewerParcelMgr::setupParcelBuy(
 
 		if (region != region2)
 		{
-			LLNotifications::instance().add("CantBuyLandAcrossMultipleRegions");
+			LLNotificationsUtil::add("CantBuyLandAcrossMultipleRegions");
 			return NULL;
 		}
 	}
@@ -1204,18 +1206,18 @@ void LLViewerParcelMgr::sendParcelDeed(const LLUUID& group_id)
 {
 	if (!mSelected || !mCurrentParcel)
 	{
-		LLNotifications::instance().add("CannotDeedLandNothingSelected");
+		LLNotificationsUtil::add("CannotDeedLandNothingSelected");
 		return;
 	}
 	if(group_id.isNull())
 	{
-		LLNotifications::instance().add("CannotDeedLandNoGroup");
+		LLNotificationsUtil::add("CannotDeedLandNoGroup");
 		return;
 	}
 	LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosGlobal( mWestSouth );
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotDeedLandNoRegion");
+		LLNotificationsUtil::add("CannotDeedLandNoRegion");
 		return;
 	}
 
@@ -2037,18 +2039,18 @@ void LLViewerParcelMgr::deedLandToGroup()
 		gCacheName->getName(mCurrentParcel->getOwnerID(), first_name, last_name);
 		args["FIRST_NAME"] = first_name;
 		args["LAST_NAME"] = last_name;
-		LLNotifications::instance().add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB);
+		LLNotificationsUtil::add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB);
 	}
 	else
 	{
-		LLNotifications::instance().add("DeedLandToGroup",args, LLSD(), deedAlertCB);
+		LLNotificationsUtil::add("DeedLandToGroup",args, LLSD(), deedAlertCB);
 	}
 }
 
 // static
 bool LLViewerParcelMgr::deedAlertCB(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getParcelSelection()->getParcel();
@@ -2067,26 +2069,26 @@ void LLViewerParcelMgr::startReleaseLand()
 {
 	if (!mSelected)
 	{
-		LLNotifications::instance().add("CannotReleaseLandNothingSelected");
+		LLNotificationsUtil::add("CannotReleaseLandNothingSelected");
 		return;
 	}
 
 	if (mRequestResult == PARCEL_RESULT_NO_DATA)
 	{
-		LLNotifications::instance().add("CannotReleaseLandWatingForServer");
+		LLNotificationsUtil::add("CannotReleaseLandWatingForServer");
 		return;
 	}
 
 	if (mRequestResult == PARCEL_RESULT_MULTIPLE)
 	{
-		LLNotifications::instance().add("CannotReleaseLandSelected");
+		LLNotificationsUtil::add("CannotReleaseLandSelected");
 		return;
 	}
 
 	if (!isParcelOwnedByAgent(mCurrentParcel, GP_LAND_RELEASE)
 		&& !(gAgent.canManageEstate()))
 	{
-		LLNotifications::instance().add("CannotReleaseLandDontOwn");
+		LLNotificationsUtil::add("CannotReleaseLandDontOwn");
 		return;
 	}
 
@@ -2094,7 +2096,7 @@ void LLViewerParcelMgr::startReleaseLand()
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotReleaseLandRegionNotFound");
+		LLNotificationsUtil::add("CannotReleaseLandRegionNotFound");
 		return;
 	}
 /*
@@ -2103,21 +2105,21 @@ void LLViewerParcelMgr::startReleaseLand()
 	{
 		LLSD args;
 		args["REGION"] = region->getName();
-		LLNotifications::instance().add("CannotReleaseLandNoTransfer", args);
+		LLNotificationsUtil::add("CannotReleaseLandNoTransfer", args);
 		return;
 	}
 */
 
 	if (!mCurrentParcelSelection->mWholeParcelSelected)
 	{
-		LLNotifications::instance().add("CannotReleaseLandPartialSelection");
+		LLNotificationsUtil::add("CannotReleaseLandPartialSelection");
 		return;
 	}
 
 	// Compute claim price
 	LLSD args;
 	args["AREA"] = llformat("%d",mCurrentParcel->getArea());
-	LLNotifications::instance().add("ReleaseLandWarning", args, LLSD(), releaseAlertCB);
+	LLNotificationsUtil::add("ReleaseLandWarning", args, LLSD(), releaseAlertCB);
 }
 
 bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
@@ -2192,13 +2194,13 @@ void LLViewerParcelMgr::startDivideLand()
 {
 	if (!mSelected)
 	{
-		LLNotifications::instance().add("CannotDivideLandNothingSelected");
+		LLNotificationsUtil::add("CannotDivideLandNothingSelected");
 		return;
 	}
 
 	if (mCurrentParcelSelection->mWholeParcelSelected)
 	{
-		LLNotifications::instance().add("CannotDivideLandPartialSelection");
+		LLNotificationsUtil::add("CannotDivideLandPartialSelection");
 		return;
 	}
 
@@ -2206,13 +2208,13 @@ void LLViewerParcelMgr::startDivideLand()
 	payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);
 	payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth);
 
-	LLNotifications::instance().add("LandDivideWarning", LLSD(), payload, callbackDivideLand);
+	LLNotificationsUtil::add("LandDivideWarning", LLSD(), payload, callbackDivideLand);
 }
 
 // static
 bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);
 	LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);
 	LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0;
@@ -2220,7 +2222,7 @@ bool LLViewerParcelMgr::callbackDivideLand(const LLSD& notification, const LLSD&
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotDivideLandNoRegion");
+		LLNotificationsUtil::add("CannotDivideLandNoRegion");
 		return false;
 	}
 
@@ -2249,19 +2251,19 @@ void LLViewerParcelMgr::startJoinLand()
 {
 	if (!mSelected)
 	{
-		LLNotifications::instance().add("CannotJoinLandNothingSelected");
+		LLNotificationsUtil::add("CannotJoinLandNothingSelected");
 		return;
 	}
 
 	if (mCurrentParcelSelection->mWholeParcelSelected)
 	{
-		LLNotifications::instance().add("CannotJoinLandEntireParcelSelected");
+		LLNotificationsUtil::add("CannotJoinLandEntireParcelSelected");
 		return;
 	}
 
 	if (!mCurrentParcelSelection->mSelectedMultipleOwners)
 	{
-		LLNotifications::instance().add("CannotJoinLandSelection");
+		LLNotificationsUtil::add("CannotJoinLandSelection");
 		return;
 	}
 
@@ -2269,13 +2271,13 @@ void LLViewerParcelMgr::startJoinLand()
 	payload["west_south_border"] = ll_sd_from_vector3d(mWestSouth);
 	payload["east_north_border"] = ll_sd_from_vector3d(mEastNorth);
 
-	LLNotifications::instance().add("JoinLandWarning", LLSD(), payload, callbackJoinLand);
+	LLNotificationsUtil::add("JoinLandWarning", LLSD(), payload, callbackJoinLand);
 }
 
 // static
 bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	LLVector3d west_south_d = ll_vector3d_from_sd(notification["payload"]["west_south_border"]);
 	LLVector3d east_north_d = ll_vector3d_from_sd(notification["payload"]["east_north_border"]);
 	LLVector3d parcel_center = (west_south_d + east_north_d) / 2.0;
@@ -2283,7 +2285,7 @@ bool LLViewerParcelMgr::callbackJoinLand(const LLSD& notification, const LLSD& r
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotJoinLandNoRegion");
+		LLNotificationsUtil::add("CannotJoinLandNoRegion");
 		return false;
 	}
 
@@ -2312,19 +2314,19 @@ void LLViewerParcelMgr::startDeedLandToGroup()
 {
 	if (!mSelected || !mCurrentParcel)
 	{
-		LLNotifications::instance().add("CannotDeedLandNothingSelected");
+		LLNotificationsUtil::add("CannotDeedLandNothingSelected");
 		return;
 	}
 
 	if (mRequestResult == PARCEL_RESULT_NO_DATA)
 	{
-		LLNotifications::instance().add("CannotDeedLandWaitingForServer");
+		LLNotificationsUtil::add("CannotDeedLandWaitingForServer");
 		return;
 	}
 
 	if (mRequestResult == PARCEL_RESULT_MULTIPLE)
 	{
-		LLNotifications::instance().add("CannotDeedLandMultipleSelected");
+		LLNotificationsUtil::add("CannotDeedLandMultipleSelected");
 		return;
 	}
 
@@ -2332,7 +2334,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()
 	LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal(parcel_center);
 	if (!region)
 	{
-		LLNotifications::instance().add("CannotDeedLandNoRegion");
+		LLNotificationsUtil::add("CannotDeedLandNoRegion");
 		return;
 	}
 
@@ -2344,7 +2346,7 @@ void LLViewerParcelMgr::startDeedLandToGroup()
 		{
 			LLSD args;
 			args["REGION"] = region->getName();
-			LLNotifications::instance().add("CannotDeedLandNoTransfer", args);
+			LLNotificationsUtil::add("CannotDeedLandNoTransfer", args);
 			return;
 		}
 	}
@@ -2374,7 +2376,7 @@ void LLViewerParcelMgr::reclaimParcel()
 // static
 bool LLViewerParcelMgr::releaseAlertCB(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if (option == 0)
 	{
 		// Send the release message, not a force
diff --git a/indra/newview/llviewerprecompiledheaders.h b/indra/newview/llviewerprecompiledheaders.h
index bb317aeb5f193da4aa6fdacf54113d8a995739b3..86f59b6e2f8cffc7099747d14516e337a82525ff 100644
--- a/indra/newview/llviewerprecompiledheaders.h
+++ b/indra/newview/llviewerprecompiledheaders.h
@@ -233,4 +233,7 @@
 // In skinning-7, llui.h dependencies are changing too often.
 //#include "llui.h"
 
+// llxuixml
+#include "llinitparam.h"
+
 #endif
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index 6f8818be6e4083e7c9b03cc2991b482e50748921..e0091145ce4d88614667e6c73536fc092ef88bc1 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -50,6 +50,7 @@
 #include "llmemorystream.h"
 #include "llmenugl.h"
 #include "llnotecard.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llpanelplaces.h"
 #include "llpreview.h"
@@ -1181,13 +1182,13 @@ void LLViewerTextEditor::showUnsavedAlertDialog( LLInventoryItem* item )
 	LLSD payload;
 	payload["item_id"] = item->getUUID();
 	payload["notecard_id"] = mNotecardInventoryID;
-	LLNotifications::instance().add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog);
+	LLNotificationsUtil::add( "ConfirmNotecardSave", LLSD(), payload, LLViewerTextEditor::onNotecardDialog);
 }
 
 // static
 bool LLViewerTextEditor::onNotecardDialog(const LLSD& notification, const LLSD& response )
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if( option == 0 )
 	{
 		LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", notification["payload"]["notecard_id"]);;
@@ -1207,13 +1208,13 @@ void LLViewerTextEditor::showCopyToInvDialog( LLInventoryItem* item, llwchar wc
 	LLUUID item_id = item->getUUID();
 	payload["item_id"] = item_id;
 	payload["item_wc"] = LLSD::Integer(wc);
-	LLNotifications::instance().add( "ConfirmItemCopy", LLSD(), payload,
+	LLNotificationsUtil::add( "ConfirmItemCopy", LLSD(), payload,
 		boost::bind(&LLViewerTextEditor::onCopyToInvDialog, this, _1, _2));
 }
 
 bool LLViewerTextEditor::onCopyToInvDialog(const LLSD& notification, const LLSD& response)
 {
-	S32 option = LLNotification::getSelectedOption(notification, response);
+	S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
 	if( 0 == option )
 	{
 		LLUUID item_id = notification["payload"]["item_id"].asUUID();
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 3f53fae36ccdea93eca319e0c65578d56467c498..f12937194dbc88403325230af6bddbd12b6a01dc 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -194,6 +194,8 @@
 #include "llagentui.h"
 #include "llwearablelist.h"
 
+#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llnotificationmanager.h"
 
 #include "llfloaternotificationsconsole.h"
@@ -4680,7 +4682,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
 		LLSD args;
 		args["RESX"] = llformat("%d",size.mX);
 		args["RESY"] = llformat("%d",size.mY);
-		LLNotifications::instance().add("ResolutionSwitchFail", args);
+		LLNotificationsUtil::add("ResolutionSwitchFail", args);
 		size = old_size; // for reshape below
 	}
 
@@ -4752,7 +4754,6 @@ F32	LLViewerWindow::getWorldViewAspectRatio() const
 	}
 	else
 	{
-		llinfos << "World aspect ratio: " << world_aspect << llendl;
 		return world_aspect;
 	}
 }
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index f33a5cc81839f541008a10e1404d6f87d7dbc7ef..e311f079120011c733cac0c149b0020badaa09c7 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -38,7 +38,7 @@
 #include "llviewercontrol.h"
 
 #include "llagent.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "lldrawable.h"
 #include "llface.h"
 #include "llsky.h"
@@ -211,7 +211,7 @@ void LLVOGrass::initClass()
 	{
 		LLSD args;
 		args["SPECIES"] = err;
-		LLNotifications::instance().add("ErrorUndefinedGrasses", args);
+		LLNotificationsUtil::add("ErrorUndefinedGrasses", args);
 	}
 
 	for (S32 i = 0; i < GRASS_MAX_BLADES; ++i)
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 8f63df8c293866a364327de11e5ffeaa39bcad0e..3554528d19fde38c1574a9db02f2bec8ae108416 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -37,6 +37,7 @@
 #include "llfloaterreg.h"
 #include "llimview.h"
 #include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llpanel.h"
 #include "llrecentpeople.h"
 #include "llviewercontrol.h"
@@ -81,13 +82,13 @@ void LLVoiceCallCapResponder::error(U32 status, const std::string& reason)
 		if ( 403 == status )
 		{
 			//403 == no ability
-			LLNotifications::instance().add(
+			LLNotificationsUtil::add(
 				"VoiceNotAllowed",
 				channelp->getNotifyArgs());
 		}
 		else
 		{
-			LLNotifications::instance().add(
+			LLNotificationsUtil::add(
 				"VoiceCallGenericError",
 				channelp->getNotifyArgs());
 		}
@@ -159,13 +160,13 @@ void LLVoiceChannel::setChannelInfo(
 	{
 		if (mURI.empty())
 		{
-			LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs);
+			LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
 			llwarns << "Received empty URI for channel " << mSessionName << llendl;
 			deactivate();
 		}
 		else if (mCredentials.empty())
 		{
-			LLNotifications::instance().add("VoiceChannelJoinFailed", mNotifyArgs);
+			LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
 			llwarns << "Received empty credentials for channel " << mSessionName << llendl;
 			deactivate();
 		}
@@ -209,7 +210,7 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
 	{
 	case STATUS_LOGIN_RETRY:
 		//mLoginNotificationHandle = LLNotifyBox::showXml("VoiceLoginRetry")->getHandle();
-		LLNotifications::instance().add("VoiceLoginRetry");
+		LLNotificationsUtil::add("VoiceLoginRetry");
 		break;
 	case STATUS_LOGGED_IN:
 		//if (!mLoginNotificationHandle.isDead())
@@ -227,7 +228,7 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
 		{
 			// if forceably removed from channel
 			// update the UI and revert to default channel
-			LLNotifications::instance().add("VoiceChannelDisconnected", mNotifyArgs);
+			LLNotificationsUtil::add("VoiceChannelDisconnected", mNotifyArgs);
 			deactivate();
 		}
 		mIgnoreNextSessionLeave = FALSE;
@@ -619,7 +620,7 @@ void LLVoiceChannelGroup::handleError(EStatusType status)
 	// notification
 	if (!notify.empty())
 	{
-		LLNotificationPtr notification = LLNotifications::instance().add(notify, mNotifyArgs);
+		LLNotificationPtr notification = LLNotificationsUtil::add(notify, mNotifyArgs);
 		// echo to im window
 		gIMMgr->addMessage(mSessionID, LLUUID::null, SYSTEM_FROM, notification->getMessage());
 	}
@@ -725,7 +726,7 @@ void LLVoiceChannelProximal::handleError(EStatusType status)
 	// notification
 	if (!notify.empty())
 	{
-		LLNotifications::instance().add(notify, mNotifyArgs);
+		LLNotificationsUtil::add(notify, mNotifyArgs);
 	}
 
 	LLVoiceChannel::handleError(status);
@@ -765,12 +766,12 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
 			if (mState == STATE_RINGING)
 			{
 				// other user declined call
-				LLNotifications::instance().add("P2PCallDeclined", mNotifyArgs);
+				LLNotificationsUtil::add("P2PCallDeclined", mNotifyArgs);
 			}
 			else
 			{
 				// other user hung up
-				LLNotifications::instance().add("VoiceChannelDisconnectedP2P", mNotifyArgs);
+				LLNotificationsUtil::add("VoiceChannelDisconnectedP2P", mNotifyArgs);
 			}
 			deactivate();
 		}
@@ -788,7 +789,7 @@ void LLVoiceChannelP2P::handleError(EStatusType type)
 	switch(type)
 	{
 	case ERROR_NOT_AVAILABLE:
-		LLNotifications::instance().add("P2PCallNoAnswer", mNotifyArgs);
+		LLNotificationsUtil::add("P2PCallNoAnswer", mNotifyArgs);
 		break;
 	default:
 		break;
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 639585de559bed89c1756831f216471540e31c85..fe0114d68721e92ce196ab3223bb2e486fa6f78c 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -52,7 +52,7 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 		STATE_CONNECTED
 	} EState;
 
-	typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t;
+	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state)> state_changed_signal_t;
 
 	// on current channel changed signal
 	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -78,7 +78,8 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 	virtual BOOL callStarted();
 	const std::string& getSessionName() const { return mSessionName; }
 
-	void setStateChangedCallback(state_changed_callback_t callback) { mStateChangedCallback = callback; }
+	boost::signals2::connection setStateChangedCallback(const state_changed_signal_t::slot_type& callback)
+	{ return mStateChangedCallback.connect(callback); }
 
 	const LLUUID getSessionID() { return mSessionID; }
 	EState getState() { return mState; }
@@ -124,7 +125,7 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 	static BOOL sSuspended;
 
 private:
-	state_changed_callback_t mStateChangedCallback;
+	state_changed_signal_t mStateChangedCallback;
 };
 
 class LLVoiceChannelGroup : public LLVoiceChannel
@@ -175,6 +176,9 @@ class LLVoiceChannelP2P : public LLVoiceChannelGroup
 
 	void setSessionHandle(const std::string& handle, const std::string &inURI);
 
+	// returns TRUE if call is incoming and FALSE otherwise
+	BOOL isIncomingCall() { return mReceivedCall; }
+
 protected:
 	virtual void setState(EState state);
 
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 479cf5a04d0ca8dd71612bacfed1d3ab4bcc1420..7e1e7c940fdd333e6fd9dd9d17bf0b7a22253cb3 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -35,8 +35,11 @@
 
 #include <boost/tokenizer.hpp>
 
+// library includes
+#include "llnotificationsutil.h"
 #include "llsdutil.h"
 
+// project includes
 #include "llvoavatar.h"
 #include "llbufferstream.h"
 #include "llfile.h"
@@ -60,6 +63,7 @@
 #include "llparcel.h"
 #include "llviewerparcelmgr.h"
 #include "llfirstuse.h"
+#include "lltrans.h"
 #include "llviewerwindow.h"
 #include "llviewercamera.h"
 #include "llvoavatarself.h"
@@ -1158,11 +1162,12 @@ LLVoiceClient::LLVoiceClient() :
 	mVoiceEnabled(false),
 	mWriteInProgress(false),
 	
-	mLipSyncEnabled(false),
-	mAPIVersion("Unknown")
+	mLipSyncEnabled(false)
 {	
 	gVoiceClient = this;
 	
+	mAPIVersion = LLTrans::getString("NotConnected");
+
 #if LL_DARWIN || LL_LINUX || LL_SOLARIS
 		// HACK: THIS DOES NOT BELONG HERE
 		// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
@@ -7051,7 +7056,7 @@ class LLViewerRequiredVoiceVersion : public LLHTTPNode
 				if (!sAlertedUser)
 				{
 					//sAlertedUser = TRUE;
-					LLNotifications::instance().add("VoiceVersionMismatch");
+					LLNotificationsUtil::add("VoiceVersionMismatch");
 					gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener
 				}
 			}
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 235e10f716fe125c60b7f4433ca64495a939c4f3..24f1c4bd246717d25b0840422439fcf7daf8a56e 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -55,7 +55,7 @@
 #include "noise.h"
 #include "pipeline.h"
 #include "llspatialpartition.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 
 extern LLPipeline gPipeline;
 
@@ -257,7 +257,7 @@ void LLVOTree::initClass()
 		{
 			LLSD args;
 			args["SPECIES"] = err;
-			LLNotifications::instance().add("ErrorUndefinedTrees", args);
+			LLNotificationsUtil::add("ErrorUndefinedTrees", args);
 		}
 };
 
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 050b218356347db8c42748a6cce0b4da4b4c1596..3cb0ec4bad832085c978210e44c3ddf348312276 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -36,6 +36,7 @@
 #include "llagentwearables.h"
 #include "llfloatercustomize.h"
 #include "lllocaltextureobject.h"
+#include "llnotificationsutil.h"
 #include "llviewertexturelist.h"
 #include "llinventorymodel.h"
 #include "llinventoryobserver.h"
@@ -1122,7 +1123,7 @@ void LLWearable::saveNewAsset() const
 		
 		LLSD args;
 		args["NAME"] = mName;
-		LLNotifications::instance().add("CannotSaveWearableOutOfSpace", args);
+		LLNotificationsUtil::add("CannotSaveWearableOutOfSpace", args);
 		return;
 	}
 
@@ -1170,7 +1171,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda
 		llwarns << buffer << " Status: " << status << llendl;
 		LLSD args;
 		args["NAME"] = type_name;
-		LLNotifications::instance().add("CannotSaveToAssetStore", args);
+		LLNotificationsUtil::add("CannotSaveToAssetStore", args);
 	}
 
 	// Delete temp file
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index 9bde85dcaf8629984c6d552d20878815e3fe3a15..31047413efdcee87c56fa73a6be6dd6097260560 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -40,6 +40,7 @@
 #include "llvoavatar.h"
 #include "llviewerinventory.h"
 #include "llviewerstats.h"
+#include "llnotificationsutil.h"
 #include "llnotify.h"
 #include "llinventorymodel.h"
 #include "lltrans.h"
@@ -187,16 +188,16 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
 		args["TYPE"] =LLTrans::getString(LLAssetType::lookupHumanReadable(data->mAssetType));
 		if (isNewWearable)
 		{
-			LLNotifications::instance().add("InvalidWearable");
+			LLNotificationsUtil::add("InvalidWearable");
 		}
 		else if (data->mName.empty())
 		{
-			LLNotifications::instance().add("FailedToFindWearableUnnamed", args);
+			LLNotificationsUtil::add("FailedToFindWearableUnnamed", args);
 		}
 		else
 		{
 			args["DESC"] = data->mName;
-			LLNotifications::instance().add("FailedToFindWearable", args);
+			LLNotificationsUtil::add("FailedToFindWearable", args);
 		}
 	}
 	// Always call callback; wearable will be NULL if we failed
diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp
index 7f0c1a13f3af8f69ad4cccc32a9101ed1e3794b2..fcc43c2b1f7b8cc1d390ad63f48c1abb2f84602e 100644
--- a/indra/newview/llwldaycycle.cpp
+++ b/indra/newview/llwldaycycle.cpp
@@ -35,7 +35,7 @@
 #include "llwldaycycle.h"
 #include "llsdserialize.h"
 #include "llwlparammanager.h"
-#include "llnotifications.h"
+#include "llnotificationsutil.h"
 #include "llxmlnode.h"
 
 #include <map>
@@ -85,7 +85,7 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName)
 				// alert the user
 				LLSD args;
 				args["SKY"] = day_data[i][1].asString();
-				LLNotifications::instance().add("WLMissingSky", args);
+				LLNotificationsUtil::add("WLMissingSky", args);
 				continue;
 			}
 			
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 5aad87630d5ce05158a4b3d15b6c1bd28b03f439..f908a015df86e6fe6e25ba5ffb5b7e6603d68522 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -346,10 +346,7 @@ LLPipeline::LLPipeline() :
 	mLightMovingMask(0),
 	mLightingDetail(0),
 	mScreenWidth(0),
-	mScreenHeight(0),
-	mViewportWidth(0),
-	mViewportHeight(0)
-
+	mScreenHeight(0)
 {
 	mNoiseMap = 0;
 	mTrueNoiseMap = 0;
@@ -517,46 +514,29 @@ void LLPipeline::resizeScreenTexture()
 	LLFastTimer ft(FTM_RESIZE_SCREEN_TEXTURE);
 	if (gPipeline.canUseVertexShaders() && assertInitialized())
 	{
-		GLuint resX = gViewerWindow->getWindowWidthRaw();
-		GLuint resY = gViewerWindow->getWindowHeightRaw();
-		GLuint view_width = gViewerWindow->getWorldViewWidthRaw();
-		GLuint view_height = gViewerWindow->getWorldViewHeightRaw();
+		GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+		GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
-		allocateScreenBuffer(resX, resY, view_width, view_height);
+		allocateScreenBuffer(resX,resY);
 	}
 }
 
-void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height)
+void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY)
 {
-	bool screen_size_changed = resX != mScreenWidth || resY != mScreenHeight;
-	bool viewport_size_changed = viewport_width != mViewportWidth || viewport_height != mViewportHeight;
-
-	if (!screen_size_changed
-		&& !viewport_size_changed)
-	{
-		// nothing to do
-		return;
-	}
-
 	// remember these dimensions
 	mScreenWidth = resX;
 	mScreenHeight = resY;
-	mViewportWidth = viewport_width;
-	mViewportHeight = viewport_height;
-
-	llinfos << "RESIZED SCREEN TEXTURE: " << resX << "x" << resY << llendl;
-
+	
 	U32 samples = gSavedSettings.getU32("RenderFSAASamples");
-
 	U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor");
+
 	if (res_mod > 1 && res_mod < resX && res_mod < resY)
 	{
 		resX /= res_mod;
 		resY /= res_mod;
 	}
 
-	if (gSavedSettings.getBOOL("RenderUIBuffer") 
-		&& screen_size_changed)
+	if (gSavedSettings.getBOOL("RenderUIBuffer"))
 	{
 		mUIScreen.allocate(resX,resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
 	}	
@@ -564,51 +544,30 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 	if (LLPipeline::sRenderDeferred)
 	{
 		//allocate deferred rendering color buffers
-		if (screen_size_changed)
-		{
-			mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-			mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-			addDeferredAttachments(mDeferredScreen);
-		}
+		mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
+		addDeferredAttachments(mDeferredScreen);
+	
 		// always set viewport to desired size, since allocate resets the viewport
-		mDeferredScreen.setViewport(viewport_width, viewport_height);
-		mDeferredDepth.setViewport(viewport_width, viewport_height);
 
-		if (screen_size_changed)
-		{
-			mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
-			mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
-		}
-		mScreen.setViewport(viewport_width, viewport_height);
-		mEdgeMap.setViewport(viewport_width, viewport_height);
+		mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
+		mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE);
 
 		for (U32 i = 0; i < 3; i++)
 		{
-			if (screen_size_changed)
-			{
-				mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
-			}
-			mDeferredLight[i].setViewport(viewport_width, viewport_height);
+			mDeferredLight[i].allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
 		}
 
 		for (U32 i = 0; i < 2; i++)
 		{
-			if (screen_size_changed)
-			{
-				mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
-			}
-			mGIMapPost[i].setViewport(viewport_width, viewport_height);
+			mGIMapPost[i].allocate(resX,resY, GL_RGB, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
 		}
 
 		F32 scale = gSavedSettings.getF32("RenderShadowResolutionScale");
 
 		for (U32 i = 0; i < 4; i++)
 		{
-			if (screen_size_changed)
-			{
-				mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
-			}
-			mShadow[i].setViewport(viewport_width, viewport_height);
+			mShadow[i].allocate(U32(resX*scale),U32(resY*scale), 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE);
 		}
 
 
@@ -617,52 +576,36 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U3
 
 		for (U32 i = 4; i < 6; i++)
 		{
-			if (screen_size_changed)
-			{
-				mShadow[i].allocate(width, height, 0, TRUE, FALSE);
-			}
-			mShadow[i].setViewport(viewport_width, viewport_height);
+			mShadow[i].allocate(width, height, 0, TRUE, FALSE);
 		}
 
 
 
 		width = nhpo2(resX)/2;
 		height = nhpo2(resY)/2;
-		if (screen_size_changed)
-		{
-			mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
-		}
-		mLuminanceMap.setViewport(viewport_width, viewport_height);
+		mLuminanceMap.allocate(width,height, GL_RGBA, FALSE, FALSE);
 	}
 	else
 	{
-		if (screen_size_changed)
-		{
-			mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
-		}
-		mScreen.setViewport(viewport_width, viewport_height);
+		mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE);		
 	}
 	
 
 	if (gGLManager.mHasFramebufferMultisample && samples > 1)
 	{
-		if (screen_size_changed)
+		mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
+		if (LLPipeline::sRenderDeferred)
 		{
-			mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples);
-			if (LLPipeline::sRenderDeferred)
-			{
-				addDeferredAttachments(mSampleBuffer);
-				mDeferredScreen.setSampleBuffer(&mSampleBuffer);
-			}
+			addDeferredAttachments(mSampleBuffer);
+			mDeferredScreen.setSampleBuffer(&mSampleBuffer);
 		}
-		mSampleBuffer.setViewport(viewport_width, viewport_height);
+
 		mScreen.setSampleBuffer(&mSampleBuffer);
 
 		stop_glerror();
 	}
 	
-	if (LLPipeline::sRenderDeferred 
-		&& screen_size_changed)
+	if (LLPipeline::sRenderDeferred)
 	{ //share depth buffer between deferred targets
 		mDeferredScreen.shareDepthBuffer(mScreen);
 		for (U32 i = 0; i < 3; i++)
@@ -762,10 +705,8 @@ void LLPipeline::createGLBuffers()
 
 	stop_glerror();
 
-	GLuint resX = gViewerWindow->getWindowWidthRaw();
-	GLuint resY = gViewerWindow->getWindowHeightRaw();
-	GLuint viewport_width = gViewerWindow->getWorldViewWidthRaw();
-	GLuint viewport_height = gViewerWindow->getWorldViewHeightRaw();
+	GLuint resX = gViewerWindow->getWorldViewWidthRaw();
+	GLuint resY = gViewerWindow->getWorldViewHeightRaw();
 	
 	if (LLPipeline::sRenderGlow)
 	{ //screen space glow buffers
@@ -777,11 +718,10 @@ void LLPipeline::createGLBuffers()
 			mGlow[i].allocate(512,glow_res,GL_RGBA,FALSE,FALSE);
 		}
 
-		// force reallocation of buffers by clearing known dimensions
+		allocateScreenBuffer(resX,resY);
 		mScreenWidth = 0;
 		mScreenHeight = 0;
 
-		allocateScreenBuffer(resX,resY, viewport_width, viewport_height);
 	}
 	
 	if (sRenderDeferred)
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 11b7b55f20b34720e6c618aa5cf7c1880cfff92c..67004a5f2d921cba497d8961dfde0eedc9190620 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -111,7 +111,7 @@ class LLPipeline
 	void resizeScreenTexture();
 	void releaseGLBuffers();
 	void createGLBuffers();
-	void allocateScreenBuffer(U32 resX, U32 resY, U32 viewport_width, U32 viewport_height);
+	void allocateScreenBuffer(U32 resX, U32 resY);
 
 	void resetVertexBuffers(LLDrawable* drawable);
 	void setUseVBO(BOOL use_vbo);
@@ -469,9 +469,7 @@ class LLPipeline
 	//screen texture
 	U32 					mScreenWidth;
 	U32 					mScreenHeight;
-	U32 					mViewportWidth;
-	U32 					mViewportHeight;
-
+	
 	LLRenderTarget			mScreen;
 	LLRenderTarget			mUIScreen;
 	LLRenderTarget			mDeferredScreen;
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index eb8ec00bb95d0cab34d64851cc50505bd15c7c37..295f4259fdfbb32674cf0c4cc3e4047f87d41a91 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -81,7 +81,7 @@
 
 	<color
      name="AgentChatColor"
-     reference="LtGray" />
+     reference="White" />
     <color
      name="AlertBoxColor"
      value="0.24 0.24 0.24 1" />
@@ -669,7 +669,7 @@
      reference="LtGray" />
     <color
      name="UserChatColor"
-     reference="LtGray" />
+     reference="White" />
     <color
      name="llOwnerSayChatColor"
      reference="LtGray" />
@@ -684,5 +684,8 @@
     <color
      name="SysWellItemSelected"
      value="0.3 0.3 0.3 1.0" />
+	<color
+     name="ChatToastAgentNameColor"
+     value="1.0 0.3 1.0 1.0" />
 
 </colors>
diff --git a/indra/newview/skins/default/textures/icons/Stop_Off.png b/indra/newview/skins/default/textures/icons/Stop_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..3ee215d36f3957b1607bf985e141005a83fa4e16
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Stop_Off.png differ
diff --git a/indra/newview/skins/default/textures/icons/UnZoom_Off.png b/indra/newview/skins/default/textures/icons/UnZoom_Off.png
new file mode 100644
index 0000000000000000000000000000000000000000..c794113755046d7eef07ba2665deec0d75c8f500
Binary files /dev/null and b/indra/newview/skins/default/textures/icons/UnZoom_Off.png differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 99f6fc5cb304478fa3093afe46841a994022cf05..3576b6ed77c0d36f8c8d124f7f96b90293a51e4f 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -490,6 +490,9 @@ with the same filename but different name
   <texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
   <texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
 
+  <texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
+  <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" />
+  <texture name="Stop_Press" file_name="icons/Stop_Press.png" preload="false" />
   <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
   <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
   <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
@@ -607,6 +610,15 @@ with the same filename but different name
   <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
   <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
   <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
+  <texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
+  <texture name="UnZoom_Over" file_name="icons/UnZoom_Over.png" preload="false" />
+  <texture name="UnZoom_Press" file_name="icons/UnZoom_Press.png" preload="false" />
+  <texture name="PowerOn_Off" file_name="icons/PowerOn_Off.png" preload="false" />
+  <texture name="PowerOn_Over" file_name="icons/PowerOn_Over.png" preload="false" />
+  <texture name="PowerOn_Press" file_name="icons/PowerOn_Press.png" preload="false" />
+  <texture name="PowerOff_Off" file_name="icons/PowerOff_Off.png" preload="false" />
+  <texture name="PowerOff_Over" file_name="icons/PowerOff_Over.png" preload="false" />
+  <texture name="PowerOff_Press" file_name="icons/PowerOff_Press.png" preload="false" />
 
   <!--WARNING OLD ART *do not use*-->
 
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index a2b6dec91c5f05331e2bcf156f27ef8010eabc51..d1fca8984d367229f83e80e5e0f0d783860f4c7d 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est">
-		for ca. US$ [USD]
+		for ca. [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Henter data...
@@ -63,6 +63,6 @@ og prøv igen.
 	<button label="Annullér" name="cancel_btn" />
 	<button label="Køb" name="buy_btn" />
 	<string name="buy_currency">
-		Køb L$ [LINDENS] for ca. US$ [USD]
+		Køb L$ [LINDENS] for ca. [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 05750a17820e9692d4e23a84ca29de9da4ff5637..56b7868c33e9558e0b9c9daeef091cab86e94825 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est">
-		für ca. [USD] US$
+		für ca. [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Daten werden geladen...
@@ -63,6 +63,6 @@ Kaufen Sie mehr.
 	<button label="Kaufen" name="buy_btn" />
 	<button label="Abbrechen" name="cancel_btn" />
 	<text name="buy_currency">
-		[LINDENS] L$ für ca. [USD] US$ kaufen
+		[LINDENS] L$ für ca. [LOCALAMOUNT] kaufen
 	</text>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml
index ab708adb06b327bddfd82133f1bf37cfa64328a9..97991153d88fda1b3a4ab7589e3c20c8fba7953c 100644
--- a/indra/newview/skins/default/xui/en/alert_line_editor.xml
+++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml
@@ -7,5 +7,5 @@
   ignore_tab="true"
   max_length="254"
   text_pad_right="0"
-  text_pad_left="0"
+  text_pad_left="2"
   mouse_opaque="true"/>
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 4bbd5618827fe48d4fb324c6d6bfe8f40d01f15b..0c64408b5059f5fa9cf4efa42a2f437aacf054a2 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -5,6 +5,6 @@
  name="floater_aaa"
  can_resize="true" 
  width="1024">
- <string name="Nudge Parabuild">2</string>
+ <string name="Nudge Parabuild">4</string>
   <panel filename="main_view.xml" follows="all" width="1024" height="768" top="0"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 4f1024f56d9f401dfafbbb1964aebfaa8b542fd7..8bfd64b3df17b06e4f7a7036b9fae7be34af797a 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -2093,7 +2093,6 @@ Texture:
              width="195" />
             <button
              follows="bottom"
-             font="SansSerifSmall"
              height="16"
              label="Add..."
              label_selected="Add..."
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index 41b1f99d4196ded5e452ca26c7d7a301f2189074..bb45e511377e4f2ea6b76a3101a4da53d7979e4c 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -452,28 +452,38 @@ Maximum animation length is [MAX_LENGTH] seconds.
      width="200" />
     <button
      follows="top|right"
-     height="28"
-     image_selected="button_anim_play_selected.tga"
-     image_unselected="button_anim_play.tga"
+     height="23"
+     image_overlay="Play_Over"
+     image_unselected="SegmentedBtn_Left_Off"
+     image_selected="SegmentedBtn_Left_On_Selected"
+        image_disabled_selected="SegmentedBtn_Left_Selected_Disabled"
+        image_disabled="SegmentedBtn_Left_Disabled"
+	image_pressed="SegmentedBtn_Left_Press"
+	image_pressed_selected="SegmentedBtn_Left_Selected_Press"
      layout="topleft"
      left="10"
      name="play_btn"
      tool_tip="Play/pause your animation"
      top_pad="0"
-     width="28" />
+     width="23" />
     <button
      follows="top|right"
-     height="28"
-     image_selected="button_anim_stop_selected.tga"
-     image_unselected="button_anim_stop.tga"
+     height="23"
+     image_overlay="StopReload_Over"
+     image_unselected="SegmentedBtn_Right_Off"
+     image_selected="SegmentedBtn_Right_On_Selected"
+        image_disabled_selected="SegmentedBtn_Right_Selected_Disabled"
+        image_disabled="SegmentedBtn_Right_Disabled"
+	image_pressed="SegmentedBtn_Right_Press"
+	image_pressed_selected="SegmentedBtn_Right_Selected_Press"
      layout="topleft"
-     left_pad="4"
      name="stop_btn"
      tool_tip="Stop animation playback"
      top_delta="0"
-     width="28" />
+     left_delta="23"
+     width="23" />
     <slider
-     left_pad="0"
+     left_pad="10"
      follows="top|right"
      height="23"
      width="200"
diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
index 7ae079f553ac6bb149c77f5346c2c514cd687a4c..53ae24fe3f1de8470209487fd33d4030076eb6a3 100644
--- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml
@@ -154,7 +154,7 @@
      image_name="Inv_Texture"
      mouse_opaque="true"
      name="icon_texture"
-     tool_top="Textures"
+     tool_tip="Textures"
      left_pad="2" />
 
     <button
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 69f9f6a2f874df5642d0095cd3ff21b4e8751f9d..d378b427f13adb53b945cd8261a8a2404bc46103 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -12,6 +12,7 @@
  help_topic="camera_floater"
  save_rect="true"
  save_visibility="true"
+ single_instance="true"
  width="150">
     <floater.string
      name="rotate_tooltip">
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index e3751f2bd992340d576264a9c2abac859e895efe..06c766f744644fc63cd85b831de5f63b6e1594d0 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -42,7 +42,6 @@
     </scroll_list>
     <button
      height="23"
-     font="SansSerif"
      label="Teleport"
      label_selected="Teleport"
      layout="topleft"
@@ -53,7 +52,6 @@
      width="80" />
     <button
      height="23"
-     font="SansSerif"
      label="Map"
      label_selected="Map"
      layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index 4f3978a5e37e1f5deca63f8fbd718f5a2eb123f0..8cc2c91ef50ef597d90fea14eb294e4204946df9 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -173,7 +173,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="Add &gt;&gt;"
      layout="topleft"
      left_pad="10"
@@ -205,7 +204,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="Up"
      layout="topleft"
      left_pad="10"
@@ -215,7 +213,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="Down"
      layout="topleft"
      left_delta="0"
@@ -225,7 +222,6 @@
     <button
      follows="top|left"
      height="20"
-     font="SansSerifSmall"
      label="Remove"
      layout="topleft"
      left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_select_key.xml b/indra/newview/skins/default/xui/en/floater_select_key.xml
index 31d133ff9b96345a3f759fa3a1cb0127edaf6bf7..af4fdff0446bb90e58eeea17bca9b8c3d299abf1 100644
--- a/indra/newview/skins/default/xui/en/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/en/floater_select_key.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <floater
  legacy_header_height="18"
- border="true"
+ border="false"
  can_close="false"
  can_minimize="false"
  height="100"
diff --git a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
index 0531b52e5a04f77205acd9c259861642431a5aa0..fe6ec91709dd06f831e4b21e289a22182119805a 100644
--- a/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_line_editor.xml
@@ -2,7 +2,7 @@
 <floater
  legacy_header_height="18"
  can_resize="true"
- height="400"
+ height="500"
  layout="topleft"
  name="floater_test_line_editor"
  help_topic="floater_test_line_editor"
@@ -62,6 +62,34 @@
    width="200">
     Disabled red-text line editor
   </line_editor>
+  <line_editor
+   height="20"
+   left_delta="0"
+   name="left_pad_editor"
+   text_pad_left="25"
+   top_pad="10"
+   width="200">
+    25 px left text padding
+  </line_editor>
+  <line_editor
+   height="20"
+   left_delta="0"
+   name="left_pad_editor"
+   text_pad_right="75"
+   top_pad="10"
+   width="200">
+    75 px right text padding
+  </line_editor>
+  <line_editor
+   height="20"
+   left_delta="0"
+   name="left_pad_editor"
+   text_pad_left="25"
+   text_pad_right="75"
+   top_pad="10"
+   width="200">
+    25 px left 75 px right text padding
+  </line_editor>
   <!-- "search_editor" is a specialized line_editor that shows read-only
        help text until the user clicks in the widget. -->
   <search_editor
diff --git a/indra/newview/skins/default/xui/en/floater_test_list_view.xml b/indra/newview/skins/default/xui/en/floater_test_list_view.xml
index 1d2086d9bc60fc854e202521244e00536f7703ed..247c705687d8e7ad5c00d2e6ef4e9f8656a4da46 100644
--- a/indra/newview/skins/default/xui/en/floater_test_list_view.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_list_view.xml
@@ -7,27 +7,5 @@
  name="floater_test_list_view"
  help_topic="floater_test_list_view"
  width="400">
-    <list_view
-     height="300"
-     left="10"
-     name="test_list_view"
-     top="28"
-     width="300" />
-  <button
-    name="test_1_btn"
-    label="Test 1"
-    top="350"
-    left="10"
-    height="20"
-    width="80"
-    commit_callback.function="TestListView.Test1" />
-  <button
-    name="test_2_btn"
-    label="Test 2"
-    top_delta="0"
-    left_pad="10"
-    height="20"
-    width="80"
-    commit_callback.function="TestListView.Test2" />
-
+ <!-- intentionally empty -->
 </floater>
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04696ca2e7b6e0e4c30a22a0a234708918c347d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ height="300"
+ layout="topleft"
+ name="floater_voice_controls"
+ title="Voice Controls"
+ save_visibility="true"
+ single_instance="true"
+ width="282">
+    <string
+     name="title_nearby">
+        NEARBY VOICE
+    </string>
+    <string
+     name="title_group">
+        Group Call with [GROUP]
+    </string>
+    <string
+     name="title_adhoc">
+        Conference Call
+    </string>
+    <string
+     name="no_one_near">
+        No one near
+    </string>
+    <panel
+     bevel_style="in"
+     follows="left|right|top"
+     height="62"
+     layout="topleft"
+     left="0"
+     name="control_panel"
+     width="282">
+        <panel
+         height="18"
+         follows="top|left|right"
+         layout="topleft"
+         left="10"
+         name="my_panel"
+         width="263">
+            <avatar_icon
+             enabled="false"
+             follows="left|top"
+             height="18"
+             default_icon_name="Generic_Person"
+             layout="topleft"
+             left="0"
+             name="user_icon"
+             top="0"
+             width="18" />
+            <text
+             follows="top|left|right"
+             font="SansSerifSmallBold"
+             height="16"
+             layout="topleft"
+             left_pad="10"
+             name="user_text"
+             text_color="white"
+             top="4"
+             use_ellipses="true" 
+             value="Mya Avatar:"
+             width="210" />
+            <output_monitor
+             auto_update="true"
+             draw_border="false"
+             follows="right"
+             height="16"
+             layout="topleft"
+             name="speaking_indicator"
+             right="-1"
+             top="2" 
+             visible="true"
+             width="20" />
+        </panel>
+        <layout_stack
+         bottom="10"
+         clip="false"
+         follows="left|right|top"
+         height="24"
+         layout="bottomleft"
+         orientation="horizontal"
+         width="262">
+            <layout_panel
+             follows="left"
+             layout="topleft"
+             min_width="24"
+             top="0"
+             user_resize="false"
+             width="24">
+                <icon
+                 height="24"
+                 image_name="Microphone_On"
+                 layout="topleft"
+                 name="Microphone_On"
+                 top="0"
+                 width="24" />
+            </layout_panel>
+            <layout_panel
+             layout="topleft"
+             top="0"
+             user_resize="false"
+             width="258">
+                <slider_bar
+                 control_name="AudioLevelMic"
+                 follows="left|right|top"
+                 height="24"
+                 increment="0.05"
+                 layout="topleft"
+                 left="0"
+                 max_val="2"
+                 name="volume_slider_bar"
+                 tool_tip="Master Volume"
+                 top="0"
+                 value="0.75"
+                 width="258" />
+            </layout_panel>
+        </layout_stack>
+    </panel>
+    <avatar_list
+     follows="all"
+     height="197"
+     ignore_online_status="true"
+     layout="topleft"
+     left="0"
+     multi_select="true"
+     name="speakers_list"
+     width="282" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
index 07c684d9047fe0910286c1770f1dd08c7fc4ae79..b5f2abf52a61a8fc9e0489cad187cc4fda4f91f3 100644
--- a/indra/newview/skins/default/xui/en/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -71,7 +71,6 @@
   </text>
   <button
    follows="top|left"
-   font="SansSerif"
    height="20"
    label="Map"
    left="10"
@@ -80,7 +79,6 @@
    width="75" />
   <button
    follows="top|left"
-   font="SansSerif"
    height="20"
    label="Block"
    left_pad="5"
@@ -89,7 +87,6 @@
    width="75" />
   <button
    follows="top|left"
-   font="SansSerif"
    height="20"
    label="Close"
    right="-10"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 972284969090be5491b49997d198522ca63199da..ae8a1599a90845a0c82b21fd3dd3a5f3e2b02656 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -373,17 +373,17 @@
                 <menu_item_call.on_enable
                  function="World.EnableSetHomeLocation" />
             </menu_item_call>
-            <menu_item_call
-             label="Teleport Home"
-             layout="topleft"
-             name="Teleport Home"
-             shortcut="control|shift|H">
-                <menu_item_call.on_click
-                 function="World.TeleportHome" />
-                <menu_item_call.on_enable
-                 function="World.EnableTeleportHome" />
-            </menu_item_call>
         </menu>
+	    <menu_item_call
+	     label="Home"
+	     layout="topleft"
+	     name="Teleport Home"
+	     shortcut="control|shift|H">
+		<menu_item_call.on_click
+		 function="World.TeleportHome" />
+		<menu_item_call.on_enable
+		 function="World.EnableTeleportHome" />
+	    </menu_item_call>
       <menu_item_check
          label="Mini-Map"
          layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 1d385b5a9f1ceddb775279253b5dc9b9685917cb..cb0614797a8c9cbe43668c4f0af421e8fafa7420 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -1170,6 +1170,13 @@ Eject [AVATAR_NAME] from your land?
      yestext="Eject"/>
   </notification>
 
+  <notification
+   icon="alertmodal.tga"
+   name="EjectAvatarFromGroup"
+   type="notify">
+You ejected [AVATAR_NAME] from group [GROUP_NAME]
+  </notification>
+
   <notification
    icon="alertmodal.tga"
    name="AcquireErrorTooManyObjects"
@@ -2375,15 +2382,15 @@ Please choose the male or female avatar. You can change your mind later.
   <notification
    icon="alertmodal.tga"
    name="GrantedModifyRights"
-   type="alertmodal">
-[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
+   type="notify">
+[NAME] has given you permission to edit their objects.
   </notification>
 
   <notification
    icon="alertmodal.tga"
    name="RevokedModifyRights"
-   type="alertmodal">
-Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
+   type="notify">
+Your privilege to modify [NAME]&apos;s objects has been revoked
   </notification>
 
   <notification
@@ -5776,6 +5783,26 @@ Server Error: Media update or get failed.
          yestext="OK"/>
     </notification>
 
+    <notification
+ icon="alertmodal.tga"
+ name="TextChatIsMutedByModerator"
+ type="alertmodal">
+Your text chat has been muted by moderator.
+        <usetemplate
+         name="okbutton"
+         yestext="OK"/>
+    </notification>
+
+    <notification
+ icon="alertmodal.tga"
+ name="VoiceIsMutedByModerator"
+ type="alertmodal">
+Your voice has been muted by moderator.
+        <usetemplate
+         name="okbutton"
+         yestext="OK"/>
+    </notification>
+
   <notification
    icon="alertmodal.tga"
    name="ConfirmClearTeleportHistory"
@@ -5822,13 +5849,6 @@ If you continue to have problems, please visit the [SUPPORT_SITE].
 - Your system memory does not meet the minimum requirements.
   </global>
 
-  <global name="PermYes">
-Yes
-  </global>
-
-  <global name="PermNo">
-No
-  </global>
 <!-- this is alert string from server. the name needs to match entire the server string, and needs to be changed
 	whenever the server string changes -->
    <global name="You can only set your 'Home Location' on your land or at a mainland Infohub.">
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index 368ab17689451d7fffe14577c4dc05d8a8aaed3c..f5fce65c7302cf0419f3ca3a41188a7a774f4e52 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -48,7 +48,6 @@
          visible="false"
          width="100" />
         <button
-         enabled="false"
          follows="all"
          bottom="10"
          height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 2eaa3a94ee29d138d8f89a077ab976f4e4eea61c..45f9d9c7b6550e765503708d0136bac55b82ab1d 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -7,6 +7,18 @@
  name="avatar_list_item"
  top="0"
  width="320">
+    <!-- 
+    Strings used to localize last interaction time.
+    See last_interaction textbox below.
+    -->
+    <string name="FormatSeconds">[COUNT]s</string>
+    <string name="FormatMinutes">[COUNT]m</string>
+    <string name="FormatHours">[COUNT]h</string>
+    <string name="FormatDays">[COUNT]d</string>
+    <string name="FormatWeeks">[COUNT]w</string>
+    <string name="FormatMonths">[COUNT]mon</string>
+    <string name="FormatYears">[COUNT]y</string>
+ 
     <icon
      follows="top|right|left"
      height="24"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index da8006d545efb993611305c915bba5235614600e..ec3f7ea7c5693ba732c0712fa99fc411ba1cfae8 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -72,7 +72,13 @@
            left="0"
            name="talk"
            top="4"
-          width="100" />
+          width="100">
+              <show_button>
+                  <show_button.init_callback
+                   function="Button.SetDockableFloaterToggle"
+                   parameter="voice_controls" />
+              </show_button>
+          </talk_button>
         </layout_panel>
         <icon
             auto_resize="false"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index 2b29796f0a1b4571260af2067c1149bf9db9b29e..34c6e02684b7886d9c6653e0453d6e7028f65c22 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -2,70 +2,26 @@
 <!-- All our XML is utf-8 encoded. -->
 <panel
   name="instant_message"
-  width="300"
+  width="315"
   height="180"
   follows="all">
-	<panel
-	width="290"
-	height="24"
-	background_visible="true"
-	background_opaque="false"
-	bg_alpha_color="Black"
-	left="5"
-	name="msg_caption">
-             <avatar_icon
-         follows="left"
-         height="18"
-         image_name="Generic_Person"
-         layout="topleft"
-         left="3"
-         mouse_opaque="true"
-         name="avatar_icon"
-         top="3"
-         width="18" />
-    	<text
-                font.style="BOLD"
-                height="12"
-	    layout="topleft"
-	    left_pad="5"
-	    top="7"
-		text_color="white"
-		word_wrap="false"
-		use_ellipses="true"
-        	mouse_opaque="true"
-		name="sender_name"
-        	width="150">
-	      Jerry Knight
-    	</text>
-   <!-- 	<icon top="22" left="215" width="15" height="15" follows="top|right"
-      		image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector" />-->
-    	<!--<icon top="22" left="215" width="10" height="10" follows="top|right"
-      		image_name="speaking_indicator.tga"	name="msg_icon"/>-->
-	 <text
-            font="SansSerifSmall"
-         follows="right|top"
-	 halign="right"
-         height="13"
-         layout="topleft"
-         right="-10"
-	 left="205"
-	 mouse_opaque="true"
-      name="msg_time"
-        top="8"
-         value="23:30"
-         width="50"
-	 word_wrap="true" />
-	</panel>
+     <avatar_icon
+        follows="left|top"
+        height="18"
+        image_name="Generic_Person"
+        layout="topleft"
+        left="3"
+        mouse_opaque="true"
+        name="avatar_icon"
+        top="3"
+        width="18" />
 	<text_chat
-      top="-35"
-      left="10"
-      right="-10"
+      top="5"
+      left="30"
       height="120"
-      follows="left|right|bottom"
       text_color="white"
       word_wrap="true"
       mouse_opaque="true"
       name="msg_text">
-      To be or not to be, that is the question. Tis a far far better thing I do than I have ever done. Tis a far far better place I go, than I have ever been.
 	</text_chat>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index ee333be0cb0cfca2a1892ba7d14f42519f1eef2a..b881719e3a9701d32ccf9b53c24c7f2af4615a97 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -12,24 +12,24 @@
      follows="all"
      height="85"
      image_name="ListItem_Over"
-     right="-3"
+     right="-2"
      mouse_opaque="false"
      name="hovered_icon"
      top="1"
      scale_image="true"
      visible="false"
-     width="307"/>
+     width="308"/>
     <icon
      follows="all"
      height="85"
      image_name="ListItem_Select"
-     right="-3"
+     right="-2"
      mouse_opaque="false"
      name="selected_icon"
      top="1"
      scale_image="true"
      visible="false"
-     width="307"/>
+     width="308"/>
     <texture_picker
      allow_no_texture="true"
      border_enabled="true"
@@ -47,37 +47,34 @@
      width="90" />
     <text
      follows="top|left|right"
-     font="SansSerifSmallBold"
-     height="16"
+     font="SansSerifSmall"
+     height="15"
      layout="topleft"
      left="110"
      name="name"
      text_color="white"
      top="9"
-     use_ellipses="false"
-     width="197"
+     use_ellipses="true"
+     width="193"
      word_wrap="false" />
     <expandable_text
      follows="top|left|right"
      font="SansSerifSmall"
-     height="40"
+     height="55"
      layout="topleft"
-     left="110"
+     left="103"
      name="description"
-     top_pad="3"
+     top_pad="0"
      width="178"
      word_wrap="true" />
     <button
-     follows="top|right"
-     height="16"
-     image_selected="BuyArrow_Press"
-     image_pressed="BuyArrow_Press"
-     image_unselected="BuyArrow_Press"
+     follows="right"
+     height="20"
+     image_overlay="ForwardArrow_Off"
      layout="topleft"
+     left_pad="5"
+     right="-8"
      name="info_chevron"
-     picture_style="true"
-     right="-7"
-     tab_stop="false"
-     top="27"
-     width="16" />
+     top_delta="15"
+     width="20" />
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 41b210557e2b85f4af5717646cee35e6515374f8..889f29fc5390c8c4a6cd3da0444355b3f2cfc514 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -61,7 +61,6 @@
          width="125"/>
 
         <button
-         enabled="false"
          bottom="10"
          follows="all" 
          height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 0a5812882da60e16afcf4d1d7cfc84647d46d428..0a3fd1699f7635af78cf729b6b37a39aa7bc92fd 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -76,7 +76,6 @@
          visible="false"
          width="100" />
         <button
-         enabled="false"
          bottom="10"
          height="20"
          label="Voice Controls"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 4b91dc6294d1e31a7a2e3a3406d5cc2ed8e34296..c52b0c83d0df30ca1e1d127074d83890d87c357d 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -6,6 +6,7 @@
    layout="topleft" 
    left="0"
    width="380"
+   help_topic="panel_landmarks"
    border="true"
    background_visible="true"
    bg_alpha_color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index a4149c174f111355a6b5aec21d32f86589870b67..37d59de66fc8b3742de034841595f03d19b808ff 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -14,7 +14,7 @@
         Things
     </panel.string>
     <filter_editor
-     text_pad_left="12"
+     text_pad_left="14"
      follows="left|top|right"
 	 font="SanSerif"
      height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index 686f4ac1d5ebb281b06abb43828638da0c22015a..89f1fe35ca0cbb797085e9009cd2b925c93e9d88 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -93,27 +93,19 @@
   </text>
   <combo_box 
    allow_text_entry="false" 
-   bottom_delta="-20" 
-   enabled="true" 
+   bottom_delta="-20"
    follows="left|top"
    height="18" 
    left="10" 
-   max_chars="20" 
-   mouse_opaque="true"
+   max_chars="20"
    name="controls" 
    width="120">
     <combo_item 
-	 type="string" 
-	 length="1" 
-	 enabled="true" 
 	 name="Standard" 
 	 value="Standard">
       Standard
     </combo_item>
     <combo_item 
-	 type="string" 
-	 length="1" 
-	 enabled="true" 
 	 name="Mini" 
 	 value="Mini">
       Mini
@@ -229,12 +221,23 @@
    width="50" />
    
   <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label">
-    X
+	X
   </text>
-  <spinner bottom_delta="0"
-	     decimal_digits="0" enabled="true" follows="left|top" height="16"
-	     increment="1" initial_val="256" label="" label_width="0"
-	     left_delta="20" max_val="2048" min_val="0" mouse_opaque="true"
-	     name="height_pixels" width="50" />
+  <spinner 
+	  bottom_delta="0"
+	  decimal_digits="0"
+	  enabled="true"
+	  follows="left|top" 
+	  height="16"
+	  increment="1"
+	  initial_val="256" 
+	  label=""
+	  label_width="0"
+	  left_delta="20" 
+	  max_val="2048" 
+	  min_val="0"
+	  mouse_opaque="true"
+	  name="height_pixels"
+	  width="50" />
  
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index bf33b752d9c819cfe54a99ef1093dac484147acf..9702bd41c825821a5eda32ac92da39479294328d 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -153,7 +153,7 @@
      layout="topleft"
      left="0"
      name="favorite"
-     image_drag_indication="Arrow_Down"
+     image_drag_indication="arrow_down.tga"
      chevron_button_tool_tip="Show more of My Favorites"
      bottom="62"
      width="590" />
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index ca84c9147b4cfde2d21d7bf730e334c23f34e323..4f0d1558760d03f3793f4833205fa877569bd934 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -27,6 +27,7 @@
    There are no picks/classifieds here
  </text>
  <accordion
+  fit_parent="true" 
   follows="all"
   height="465"
   layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 0ac0521b10c4d9fe071f82d6e94bb174e9c4e46f..6a61953319befdb1f2d9e40420192d5f8a53a96c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -319,7 +319,6 @@ Avatars:
      bottom_delta="0"
      enabled_control="EnableVoiceChat"
      follows="left"
-     font="SansSerif"
      halign="center"
      height="20"
      label="Middle Mouse Button"
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index 88049fe7d1138970edb818b00f6fccd638546a69..8b86067b036eb8b22b9e2bc04e18e64b737edcc9 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -3,12 +3,17 @@
 	follows="left|right|top|bottom"
 	name="MediaControls"
 	background_visible="false"
-	height="160"
+	height="192"
 	layout="topleft"
 	mouse_opaque="false"
 	width="800">
   <string name="control_background_image_name">Inspector_Background</string>
   <string name="skip_step">0.2</string>
+  <string name="min_width">400</string>
+  <string name="min_height">120</string>
+  <string name="zoom_near_padding">1.0</string>
+  <string name="zoom_medium_padding">1.25</string>
+  <string name="zoom_far_padding">1.5</string>
   <panel
 	  name="media_region"
 	  bottom="125"
@@ -16,49 +21,11 @@
 	  layout="topleft"
 	  mouse_opaque="false"
 	  top="20" />
-  <layout_stack
-	  follows="left|right|bottom"
-	  height="32"
-	  layout="topleft"
-	  animate="false"
-	  left="0"
-	  orientation="horizontal"
-	  top="96">
-	<!-- outer layout_panels center the inner one -->
-	<layout_panel
-		width="0"
-		layout="topleft"
-		user_resize="false" />
-	<panel
-		name="media_progress_indicator"
-		height="22"
-		layout="topleft"
-		visible="false"
-		left="0"
-		top="0"
-		auto_resize="false"
-		user_resize="false"
-		min_width="100"
-		width="200">
-	  <progress_bar
-		  name="media_progress_bar"
-		  color_bar="1 1 1 0.96"
-		  follows="left|right|top"
-		  height="16"
-		  layout="topleft"
-		  left="0"
-		  tool_tip="Media is Loading"/>
-	</panel>
-	<layout_panel
-		width="0"
-		layout="topleft"
-		user_resize="false" />
-  </layout_stack>
   <layout_stack
 	  name="media_controls"
 	  follows="left|right"
 	  animate="false"
-	  height="32"
+	  height="26"
 	  layout="topleft"
 	  left="0"
 	  orientation="horizontal"
@@ -152,9 +119,8 @@
 		top="2"
 		min_width="22"
 		width="22">
-	  <!-- The stop button here is temporary artwork -->
 	  <button
-		  image_overlay="media_btn_stoploading.png"
+		  image_overlay="Stop_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
@@ -274,18 +240,17 @@
 		width="190"
 		min_width="90">
 	  <!--
-		  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
-
-<combo_box
-name="media_address_url"
-allow_text_entry="true"
-height="22"
-layout="topleft"
-max_chars="1024"
-tool_tip = "Media URL"
-<combo_box.commit_callback
-function="MediaCtrl.CommitURL" />
-</combo_box>
+	  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
+	  <combo_box
+		  name="media_address_url"
+		  allow_text_entry="true"
+		  height="22"
+		  layout="topleft"
+		  max_chars="1024"
+		  tool_tip = "Media URL">
+		<combo_box.commit_callback
+			function="MediaCtrl.CommitURL" />
+	  </combo_box>
 	  -->
 	  <line_editor 
 		  name="media_address_url"
@@ -343,17 +308,17 @@ function="MediaCtrl.CommitURL" />
 		user_resize="false"
 		follows="left|right|top|bottom"
 		layout="topleft"
+		height="16"		
 		min_width="100"
 		width="200">
 	  <slider_bar
 		  name="media_play_slider"
 		  follows="left|right|top"
-		  height="22"
+		  height="16"
 		  increment="0.05"
 		  initial_value="0.5"
 		  layout="topleft"
 		  tool_tip="Movie play progress"
-		  top="8"
 		  min_width="100"
 		  width="200">
 		<slider_bar.commit_callback
@@ -417,8 +382,8 @@ function="MediaCtrl.CommitURL" />
 		height="22"
 		min_width="22"
 		width="22">
-	  <!-- Note: this isn't quite right either...the mute button is not the -->
-	  <!-- same as the others because it can't have the "image_overlay" be  -->
+	  <!-- Note: this is not quite right either...the mute button is not the -->
+	  <!-- same as the others because it cannot have the "image_overlay" be  -->
 	  <!-- two different images.  -->
 	  <button
 		  image_disabled="PushButton_Disabled"
@@ -439,7 +404,7 @@ function="MediaCtrl.CommitURL" />
 			function="MediaCtrl.ToggleMute" />
 	  </button>
 	</layout_panel>
-	<!-- We don't have a design yet for "volume", so this is a temporary -->
+	<!-- We do not have a design yet for "volume", so this is a temporary -->
 	<!-- solution.  See DEV-42827. -->
 	<layout_panel
 		name="volume_up"
@@ -609,9 +574,8 @@ function="MediaCtrl.CommitURL" />
 		layout="topleft"
 		min_width="21"
 		width="21" >
-	  <!-- There is no "Zoom out" icon, so we use this temporarily -->
 	  <button
-		  image_overlay="ForwardArrow_Off"
+		  image_overlay="UnZoom_Off"
 		  image_disabled="PushButton_Disabled"
 		  image_disabled_selected="PushButton_Disabled"
 		  image_selected="PushButton_Selected"
@@ -657,4 +621,42 @@ function="MediaCtrl.CommitURL" />
 		layout="topleft"
 		user_resize="false" />
   </layout_stack>
+  <layout_stack
+	  follows="left|right|bottom"
+	  height="20"
+	  layout="topleft"
+	  animate="false"
+	  left="0"
+	  orientation="horizontal"
+	  top="150">
+	<!-- outer layout_panels center the inner one -->
+	<layout_panel
+		width="0"
+		layout="topleft"
+		user_resize="false" />
+	<panel
+		name="media_progress_indicator"
+		height="20"
+		layout="topleft"
+		left="0"
+		top="0"
+		auto_resize="false"
+		user_resize="false"
+		min_width="100"
+		width="200">
+	  <progress_bar
+		  name="media_progress_bar"
+		  color_bar="1 1 1 0.96"
+		  follows="left|right|top"
+		  top="5"
+		  height="8"
+		  layout="topleft"
+		  left="0"
+		  tool_tip="Media is Loading"/>
+	</panel>
+	<layout_panel
+		width="0"
+		layout="topleft"
+		user_resize="false" />
+  </layout_stack>
 </panel>
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 65bc48265dd09f0153bc7d9e2fb693902f015fce..9c66653e3c3be7c0155dde77dc226a8a483d4294 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -81,6 +81,17 @@
      name="volume_btn"
      tool_tip="Global Volume Control"
      width="16" />
+    <panel
+     class="panel_volume_pulldown"
+     follows="all"
+     height="533"
+     layout="topleft"
+     left="0"
+     name="volume_pulldown"
+     top="5"
+     visible="false"
+     width="313" />
+
     <text
      enabled="true"
      follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 01204ba7795faef7c062c44cd92615074f9f65b8..32fc9fce01c87e19636f85b0a1d0e7c2cf7446c0 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <panel name="Teleport History" bottom="0" height="326" left="0" width="380"
+     help_topic="panel_teleport_history"
      border="true" follows="left|top|right|bottom">     
     <accordion
      follows="left|top|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 90fb3a6bf990dfc6af9fbd526ed890cdb728332a..e47ec1ebda1edb6cc42b370a9e4227299c80c153 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -267,6 +267,7 @@
 	<string name="ChangePermissions">Change its permissions</string>
 	<string name="TrackYourCamera">Track your camera</string>
 	<string name="ControlYourCamera">Control your camera</string>
+	<string name="NotConnected">Not Connected</string>
 
 	<!-- Sim Access labels -->
 	<string name="SIM_ACCESS_PG">PG</string>
@@ -1819,6 +1820,9 @@ this texture in your inventory
 	<string name="LoadingContents">Loading contents...</string>
 	<string name="NoContents">No contents</string>
 	<string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
+	<!-- Inventory permissions -->
+	<string name="PermYes">Yes</string>
+	<string name="PermNo">No</string>
 
 	<!-- Gestures labels -->
     <!-- use value="" because they have preceding spaces -->
@@ -2260,22 +2264,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Attached">Attached</string>
 <string name="Attached Earlobes">Attached Earlobes</string>
 
-<string name="Back Bangs">Back Bangs</string>
-<string name="Back Bangs Down">Back Bangs Down</string>
-<string name="Back Bangs Up">Back Bangs Up</string>
+
 <string name="Back Fringe">Back Fringe</string>
-<string name="Back Hair">Back Hair</string>
-<string name="Back Hair Down">Back Hair Down</string>
-<string name="Back Hair Up">Back Hair Up</string>
+
 <string name="Baggy">Baggy</string>
 <string name="Bangs">Bangs</string>
-<string name="Bangs Down">Bangs Down</string>
-<string name="Bangs Up">Bangs Up</string>
+
 <string name="Beady Eyes">Beady Eyes</string>
 <string name="Belly Size">Belly Size</string>
 <string name="Big">Big</string>
 <string name="Big Butt">Big Butt</string>
-<string name="Big Eyeball">Big Eyeball</string>
+
 <string name="Big Hair Back">Big Hair: Back</string>
 <string name="Big Hair Front">Big Hair: Front</string>
 <string name="Big Hair Top">Big Hair: Top</string>
@@ -2345,20 +2344,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 
 
 <string name="Corner Down">Corner Down</string>
-<string name="Corner Normal">Corner Normal</string>
+
 <string name="Corner Up">Corner Up</string>
 <string name="Creased">Creased</string>
 <string name="Crooked Nose">Crooked Nose</string>
-<string name="Cropped Hair">Cropped Hair</string>
+
 <string name="Cuff Flare">Cuff Flare</string>
 <string name="Dark">Dark</string>
 <string name="Dark Green">Dark Green</string>
 <string name="Darker">Darker</string>
 <string name="Deep">Deep</string>
 <string name="Default Heels">Default Heels</string>
-<string name="Default Toe">Default Toe</string>
+
 <string name="Dense">Dense</string>
-<string name="Dense hair">Dense hair</string>
+
 <string name="Double Chin">Double Chin</string>
 <string name="Downturned">Downturned</string>
 <string name="Duffle Bag">Duffle Bag</string>
@@ -2374,7 +2373,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Eye Pop">Eye Pop</string>
 <string name="Eye Size">Eye Size</string>
 <string name="Eye Spacing">Eye Spacing</string>
-<string name="Eyeball Size">Eyeball Size</string>
+
 <string name="Eyebrow Arc">Eyebrow Arc</string>
 <string name="Eyebrow Density">Eyebrow Density</string>
 
@@ -2385,27 +2384,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Eyelash Length">Eyelash Length</string>
 <string name="Eyeliner">Eyeliner</string>
 <string name="Eyeliner Color">Eyeliner Color</string>
-<string name="Eyes Back">Eyes Back</string>
+
 <string name="Eyes Bugged">Eyes Bugged</string>
-<string name="Eyes Forward">Eyes Forward</string>
-<string name="Eyes Long Head">Eyes Long Head</string>
+
+
 <string name="Eyes Shear Left Up">Eyes Shear Left Up</string>
 <string name="Eyes Shear Right Up">Eyes Shear Right Up</string>
-<string name="Eyes Short Head">Eyes Short Head</string>
-<string name="Eyes Spread">Eyes Spread</string>
-<string name="Eyes Sunken">Eyes Sunken</string>
-<string name="Eyes Together">Eyes Together</string>
+
+
+
+
 <string name="Face Shear">Face Shear</string>
 <string name="Facial Definition">Facial Definition</string>
 <string name="Far Set Eyes">Far Set Eyes</string>
-<string name="Fat">Fat</string>
-<string name="Fat Head">Fat Head</string>
+
 <string name="Fat Lips">Fat Lips</string>
-<string name="Fat Lower">Fat Lower</string>
-<string name="Fat Lower Lip">Fat Lower Lip</string>
-<string name="Fat Torso">Fat Torso</string>
-<string name="Fat Upper">Fat Upper</string>
-<string name="Fat Upper Lip">Fat Upper Lip</string>
+
 <string name="Female">Female</string>
 <string name="Fingerless">Fingerless</string>
 <string name="Fingers">Fingers</string>
@@ -2418,12 +2412,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Forehead Angle">Forehead Angle</string>
 <string name="Forehead Heavy">Forehead Heavy</string>
 <string name="Freckles">Freckles</string>
-<string name="Front Bangs Down">Front Bangs Down</string>
-<string name="Front Bangs Up">Front Bangs Up</string>
+
 <string name="Front Fringe">Front Fringe</string>
-<string name="Front Hair">Front Hair</string>
-<string name="Front Hair Down">Front Hair Down</string>
-<string name="Front Hair Up">Front Hair Up</string>
+
 <string name="Full Back">Full Back</string>
 <string name="Full Eyeliner">Full Eyeliner</string>
 <string name="Full Front">Full Front</string>
@@ -2522,7 +2513,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Long Ponytail">Long Ponytail</string>
 <string name="Long Torso">Long Torso</string>
 <string name="Long arms">Long arms</string>
-<string name="Longcuffs">Longcuffs</string>
+
 
 <string name="Loose Pants">Loose Pants</string>
 <string name="Loose Shirt">Loose Shirt</string>
@@ -2582,7 +2573,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="No Blush">No Blush</string>
 <string name="No Eyeliner">No Eyeliner</string>
 <string name="No Eyeshadow">No Eyeshadow</string>
-<string name="No Heels">No Heels</string>
+
 <string name="No Lipgloss">No Lipgloss</string>
 <string name="No Lipstick">No Lipstick</string>
 <string name="No Part">No Part</string>
@@ -2603,7 +2594,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Nostril Division">Nostril Division</string>
 <string name="Nostril Width">Nostril Width</string>
 
-<string name="Old">Old</string>
+
 <string name="Opaque">Opaque</string>
 <string name="Open">Open</string>
 <string name="Open Back">Open Back</string>
@@ -2640,7 +2631,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Platform Width">Platform Width</string>
 <string name="Pointy">Pointy</string>
 <string name="Pointy Heels">Pointy Heels</string>
-<string name="Pointy Toe">Pointy Toe</string>
+
 <string name="Ponytail">Ponytail</string>
 <string name="Poofy Skirt">Poofy Skirt</string>
 <string name="Pop Left Eye">Pop Left Eye</string>
@@ -2649,30 +2640,30 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Puffy Eyelids">Puffy Eyelids</string>
 <string name="Rainbow Color">Rainbow Color</string>
 <string name="Red Hair">Red Hair</string>
-<string name="Red Skin">Red Skin</string>
+
 <string name="Regular">Regular</string>
-<string name="Regular Muscles">Regular Muscles</string>
+
 <string name="Right Part">Right Part</string>
 <string name="Rosy Complexion">Rosy Complexion</string>
 <string name="Round">Round</string>
-<string name="Round Forehead">Round Forehead</string>
+
 <string name="Ruddiness">Ruddiness</string>
 <string name="Ruddy">Ruddy</string>
 <string name="Rumpled Hair">Rumpled Hair</string>
 <string name="Saddle Bags">Saddle Bags</string>
-<string name="Saddlebags">Saddlebags</string>
-<string name="Scrawny">Scrawny</string>
+
+
 <string name="Scrawny Leg">Scrawny Leg</string>
 <string name="Separate">Separate</string>
-<string name="Shading">Shading</string>
-<string name="Shadow hair">Shadow hair</string>
+
+
 <string name="Shallow">Shallow</string>
 <string name="Shear Back">Shear Back</string>
 <string name="Shear Face">Shear Face</string>
 <string name="Shear Front">Shear Front</string>
-<string name="Shear Left">Shear Left</string>
+
 <string name="Shear Left Up">Shear Left Up</string>
-<string name="Shear Right">Shear Right</string>
+
 <string name="Shear Right Up">Shear Right Up</string>
 <string name="Sheared Back">Sheared Back</string>
 <string name="Sheared Front">Sheared Front</string>
@@ -2696,16 +2687,14 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Short Torso">Short Torso</string>
 <string name="Short hips">Short hips</string>
 <string name="Shoulders">Shoulders</string>
-<string name="Side Bangs">Side Bangs</string>
-<string name="Side Bangs Down">Side Bangs Down</string>
-<string name="Side Bangs Up">Side Bangs Up</string>
+
 <string name="Side Fringe">Side Fringe</string>
 <string name="Sideburns">Sideburns</string>
 
 <string name="Sides Hair">Sides Hair</string>
 <string name="Sides Hair Down">Sides Hair Down</string>
 <string name="Sides Hair Up">Sides Hair Up</string>
-<string name="Skinny">Skinny</string>
+
 <string name="Skinny Neck">Skinny Neck</string>
 <string name="Skirt Fit">Skirt Fit</string>
 <string name="Skirt Length">Skirt Length</string>
@@ -2726,7 +2715,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Smooth Hair">Smooth Hair</string>
 <string name="Socks Length">Socks Length</string>
 
-<string name="Some">Some</string>
+
 <string name="Soulpatch">Soulpatch</string>
 
 <string name="Sparse">Sparse</string>
@@ -2734,24 +2723,21 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Square">Square</string>
 <string name="Square Toe">Square Toe</string>
 <string name="Squash Head">Squash Head</string>
-<string name="Squash/Stretch Head">Squash/Stretch Head</string>
+
 <string name="Stretch Head">Stretch Head</string>
 <string name="Sunken">Sunken</string>
 <string name="Sunken Chest">Sunken Chest</string>
 <string name="Sunken Eyes">Sunken Eyes</string>
 <string name="Sweep Back">Sweep Back</string>
 <string name="Sweep Forward">Sweep Forward</string>
-<string name="Swept Back">Swept Back</string>
-<string name="Swept Back Hair">Swept Back Hair</string>
-<string name="Swept Forward">Swept Forward</string>
-<string name="Swept Forward Hair">Swept Forward Hair</string>
+
 <string name="Tall">Tall</string>
 <string name="Taper Back">Taper Back</string>
 <string name="Taper Front">Taper Front</string>
 <string name="Thick Heels">Thick Heels</string>
 <string name="Thick Neck">Thick Neck</string>
 <string name="Thick Toe">Thick Toe</string>
-<string name="Thickness">Thickness</string>
+
 <string name="Thin">Thin</string>
 <string name="Thin Eyebrows">Thin Eyebrows</string>
 <string name="Thin Lips">Thin Lips</string>
@@ -2762,8 +2748,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
 <string name="Tight Shirt">Tight Shirt</string>
 <string name="Tight Skirt">Tight Skirt</string>
 <string name="Tight Sleeves">Tight Sleeves</string>
-<string name="Tilt Left">Tilt Left</string>
-<string name="Tilt Right">Tilt Right</string>
+
 <string name="Toe Shape">Toe Shape</string>
 <string name="Toe Thickness">Toe Thickness</string>
 <string name="Torso Length">Torso Length</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 7c54e618ef63740cdb8cd30566befe263c6ad7a2..28ed56054328059e32d7edf3c0414da51fd3f5e7 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -15,6 +15,7 @@
         image_color="ButtonImageColor"
         image_color_disabled="ButtonImageColor"
         flash_color="ButtonFlashBgColor"
+	font="SansSerifSmall"
         hover_glow_amount="0.15"
         halign="center"
         scale_image="true">
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index ec8395a7c5408ee6140756a557632a3aa48f0c5b..0e34243349aa8357022808947d57e540b17065f3 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -2,7 +2,7 @@
 <filter_editor
   clear_button_visible="true"
   search_button_visible="true"
-  text_pad_left="5"
+  text_pad_left="7"
   select_on_focus="true"
   background_image="TextField_Search_Off"
   background_image_disabled="TextField_Search_Disabled"
diff --git a/indra/newview/skins/default/xui/en/widgets/floater.xml b/indra/newview/skins/default/xui/en/widgets/floater.xml
index 6660fbf1a823e79cf59b175a133cc688c67e2482..2263866471ec68e913f37a3768a025b7bd81feef 100644
--- a/indra/newview/skins/default/xui/en/widgets/floater.xml
+++ b/indra/newview/skins/default/xui/en/widgets/floater.xml
@@ -7,4 +7,19 @@
          bg_alpha_image="Window_Background" 
          background_visible="true"
          background_opaque="false"
-         header_height="25" />
+         header_height="25"
+  close_image="Icon_Close_Foreground"
+  restore_image="Icon_Restore_Foreground"
+  minimize_image="Icon_Minimize_Foreground"
+  tear_off_image="tearoffbox.tga"
+  dock_image="Icon_Dock_Foreground"
+  undock_image="Icon_Undock_Foreground"
+  help_image="Icon_Help_Foreground"
+  close_pressed_image="Icon_Close_Press"
+  restore_pressed_image="Icon_Restore_Press"
+  minimize_pressed_image="Icon_Minimize_Press"
+  tear_off_pressed_image="tearoff_pressed.tga"
+  dock_pressed_image="Icon_Dock_Press"
+  undock_pressed_image="Icon_Undock_Press"
+  help_pressed_image="Icon_Help_Press"
+  />
diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
index 546fbd9b47f3161c64efe50d1e7e0e1edecf0c63..a21e3f2645087f765f55111a03eda2ab0c504fa9 100644
--- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
@@ -8,6 +8,7 @@
              ignore_tab="true"
              cursor_color="TextCursorColor"
              text_color="TextFgColor"
+			 text_pad_left="2"
              text_readonly_color="TextFgReadOnlyColor"
              text_tentative_color="TextFgTentativeColor"
 			 highlight_color="EmphasisColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 17b1479ec4df7d03f980820a195ef587c3ed26c4..90887dead66ea8d9dd241a2e06222dfed5466316 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -11,6 +11,7 @@
                 add_landmark_image_disabled="Favorite_Star_Off"
                 add_landmark_image_hover="Favorite_Star_Over"
                 add_landmark_image_selected="Favorite_Star_Press"
+				add_landmark_hpad="10"
                 icon_hpad="2"
                 allow_text_entry="true"
                 list_position="below"
@@ -38,6 +39,15 @@
                           scale_image="false"
 			  top="19"
 			  left="-3" />
+  <for_sale_button
+    name="for_sale_btn"
+    image_unselected="parcel_lght_ForSale"
+    width="22"
+    height="18"
+    follows="right|top"
+    scale_image="false"
+    top="21"
+    />
   <voice_icon
     name="voice_icon"
     width="22"
@@ -84,7 +94,7 @@
   <!-- Default text color is invisible on top of nav bar background -->
   <damage_text
     name="damage_text"
-	width="50"
+	width="35"
 	height="18"
 	top="16"
 	halign="right"
@@ -98,7 +108,7 @@
   <combo_list bg_writeable_color="MenuDefaultBgColor" page_lines="10"
               scroll_bar_bg_visible="true" />
   <combo_editor name="Combo Text Entry"
-                text_pad_left="20"
+                text_pad_left="22"
                 select_on_focus="false"
                 font="SansSerifSmall"
                 bevel_style="none"
diff --git a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
index 56204201efd32e5de205fd3525b930b9a42ccb14..c2a70d4b39dcaaa53a544995007089b1267fee0f 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_combo_box.xml
@@ -13,7 +13,7 @@
  <combo_editor
   name="child1"
   select_on_focus="true"
-  text_pad_left="28" 
+  text_pad_left="30" 
   background_image="TextField_Search_Off"
   background_image_disabled="TextField_Search_Disabled"
   background_image_focused="TextField_Search_Active"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 9a79243b0335dfdcf17c7a3274703bfe72714ffe..f644a710b224ba9a7d27539e3eb459ff21190af6 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -2,7 +2,7 @@
 <search_editor
   clear_button_visible="false"
   search_button_visible="true"
-  text_pad_left="4" 
+  text_pad_left="6" 
   select_on_focus="true"
   background_image="TextField_Search_Off"
   background_image_disabled="TextField_Search_Disabled"
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index af542acbcefe6de1b2bb6810a344f0a1b181e657..eb25493adced2574a6cf8b41b30913a1cb15455f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est" width="138" left_delta="68">
-		L$  por, aprox., [USD] US$
+		por, aprox., [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Obteniendo los datos...
@@ -63,6 +63,6 @@ Aumente la cantidad a comprar.
 	<button label="Cancelar" name="cancel_btn"/>
 	<button label="Comprar" name="buy_btn"/>
 	<string name="buy_currency">
-		Compre [LINDENS] L$ por, aprox., [USD] US$
+		Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index 4417006fc6d502457dfb7dd0f5a5978b56dc14a0..a4ad14294e93694e968e3915223457caf740042a 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -114,12 +114,13 @@ La longueur maximale est de [MAX_LENGTH] secondes.
 	</text>
 	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
 	<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/>
-	<spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
-	<spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
-	<text name="hand_label" width="110">
-		Mouvement de main
+	<spinner label="Début (%)" label_width="65" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
+	<spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
+	<text name="hand_label">
+		Mouvement de
+main
 	</text>
-	<combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation" width="124">
+	<combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation">
 		<combo_box.item label="Doigts écartés" name="Spread"/>
 		<combo_box.item label="Détendues" name="Relaxed"/>
 		<combo_box.item label="Pointer (les deux)" name="PointBoth"/>
@@ -137,7 +138,7 @@ La longueur maximale est de [MAX_LENGTH] secondes.
 	<text name="emote_label">
 		Expression
 	</text>
-	<combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation." width="124">
+	<combo_box label="" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
 		<combo_box.item label="None]" name="[None]"/>
 		<combo_box.item label="Aaaaah" name="Aaaaah"/>
 		<combo_box.item label="Effrayé" name="Afraid"/>
@@ -159,27 +160,25 @@ La longueur maximale est de [MAX_LENGTH] secondes.
 		<combo_box.item label="Clin d&apos;Å“il" name="Wink"/>
 		<combo_box.item label="Soucis" name="Worry"/>
 	</combo_box>
-	<text name="preview_label" width="110">
-		Prévisualiser pendant
+	<text name="preview_label">
+		Prévisualiser
+pendant
 	</text>
-	<combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124">
+	<combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
 		<combo_box.item label="Debout" name="Standing"/>
 		<combo_box.item label="En train de marcher" name="Walking"/>
 		<combo_box.item label="Assis" name="Sitting"/>
 		<combo_box.item label="En train de voler" name="Flying"/>
 	</combo_box>
-	<spinner label="Transition 
-début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
-	<spinner label="Transition 
-fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." width="125"/>
-	<button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
+	<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
+	<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." />
+	<button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
 	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
 	<slider label="" name="playback_slider"/>
 	<text name="bad_animation_text">
 		Impossible de lire le fichier d&apos;animation.
 
-Nous recommandons les fichiers BVH extraits de
-Poser 4.
+Nous recommandons les fichiers BVH extraits de Poser 4.
 	</text>
 	<button label="Annuler" name="cancel_btn"/>
 	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 9112d30be270099101dbd20a5903fcfa8bd31bc0..603b7587b4cdb2f6967ca3cb58eb3d05fe7a5c9c 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est" width="138" left_delta="68">
-		L$  pour environ [USD] US$
+		pour environ [LOCALAMOUNT]
 	</text>
 	<text name="getting_data" width="138">
 		Obtention des données...
@@ -64,6 +64,6 @@ Veuillez saisir un montant plus élevé.
 	<button label="Acheter" name="buy_btn"/>
 	<button label="Annuler" name="cancel_btn"/>
 	<string name="buy_currency">
-		Acheter [LINDENS] L$ pour environ [USD] US$
+		Acheter [LINDENS] L$ pour environ [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml
index 1f76202dee48cc5e8d3c035e4b24c1c8c1bdb0a4..ddb868b04a95b64a6670824f133de4ec7e7cf5f5 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,71 +1,68 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <floater name="worldmap" title="CARTE DU MONDE">
-	<tab_container name="maptab" width="955">
-		<panel label="Objets" name="objects_mapview" width="953"/>
-		<panel label="Terrain" name="terrain_mapview" width="953"/>
-	</tab_container>
-	<icon left="973" name="self"/>
+	<panel name="objects_mapview" width="542"/>
+	<icon name="self" left="-270"/>
 	<text name="you_label">
 		Vous
 	</text>
-	<icon left="1033" name="home"/>
+	<icon name="home"/>
 	<text name="home_label">
 		Domicile
 	</text>
-	<icon left="973" name="square2"/>
+	<icon name="square2" left="-270"/>
 	<text name="auction_label">
 		Terrain aux enchères
 	</text>
-	<icon left="1105" name="square"/>
+	<icon name="square" left_delta="130"/>
 	<text name="land_for_sale_label">
 		Terrain à vendre
 	</text>
-	<button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
-	<icon left="977" name="person"/>
+	<button left="-120" width="108" label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
+	<icon left="-262" name="person"/>
 	<check_box label="Résident" name="people_chk"/>
-	<icon left="973" name="infohub"/>
+	<icon left="-266" name="infohub"/>
 	<check_box label="Infohub" name="infohub_chk"/>
-	<icon left="973" name="telehub"/>
+	<icon left="-266" name="telehub"/>
 	<check_box label="Téléhub" name="telehubchk"/>
-	<icon left="973" name="landforsale"/>
+	<icon left="-266" name="landforsale"/>
 	<check_box label="Terrain à vendre" name="land_for_sale_chk"/>
-	<text name="events_label" left="1099">
+	<text name="events_label" left="-144">
 		Événements :
 	</text>
-	<icon left="1121" name="event"/>
+	<icon left="-132" name="event"/>
 	<check_box label="PG" name="event_chk"/>
-	<icon left="1121" name="events_mature_icon"/>
+	<icon left="-132" name="events_mature_icon"/>
 	<check_box label="Mature" name="event_mature_chk"/>
-	<icon left="1121" name="events_adult_icon"/>
+	<icon left="-132" name="events_adult_icon"/>
 	<check_box label="Adult" name="event_adult_chk"/>
-	<icon left="973" name="avatar_icon"/>
+	<icon left="-270" name="avatar_icon"/>
 	<combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">
 		<combo_box.item name="item1" label="Amis connectés" />
 	</combo_box>
-	<icon left="973" name="landmark_icon"/>
+	<icon left="-270" name="landmark_icon"/>
 	<combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
 		<combo_box.item name="item1" label="Repères" />
 	</combo_box>
-	<icon left="973" name="location_icon"/>
+	<icon left="-270" name="location_icon"/>
 	<line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155"/>
 	<button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/>
-	<text left="973" name="search_label">
+	<text left="-270" name="search_label">
 		Résultats de la recherche :
 	</text>
-	<scroll_list left="973" name="search_results" width="252">
+	<scroll_list left="-270" name="search_results" width="252">
 		<column label="" name="icon"/>
 		<column label="" name="sim_name"/>
 	</scroll_list>
-	<text left="973" name="location_label">
+	<text left="-270" name="location_label">
 		Emplacement :
 	</text>
-	<spinner left="1078" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
+	<spinner left_delta="100" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
 	<spinner name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>
 	<spinner name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>
 	<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
 	<button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
 	<button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>
 	<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar" width="165"/>
-	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLurl pour l&apos;utiliser sur le Web." width="262"/>
+	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLurl pour l&apos;utiliser sur le Web." />
 	<slider label="Zoom" left="-270" name="zoom slider"/>
 </floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 6b881683f130137be635580b4d37f5c77f88c8cd..a22850bc4b96087c0f130329c5ad5daf72c287ad 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est">
-		L$  per circa [USD]US$
+		per circa [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Dati in ricezione...
@@ -64,6 +64,6 @@ Devi aumentare l&apos;importo da acquistare.
 	<button label="Cancella" name="cancel_btn"/>
 	<button label="Acquista" name="buy_btn"/>
 	<string name="buy_currency">
-		acquistare [LINDENS] L$ per circa [USD] US$
+		acquistare [LINDENS]L$ per circa [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index 9d5aea612b409bc2c340fc5c440ab58a663f5bc8..35516301fc6efd473e1d308ab3342cb728e1523a 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est">
-		ç´„US$ [USD]
+		ç´„[LOCALAMOUNT]
 	</text>
 	<text name="getting_data" left_delta="3">
 		データを取得しています...
@@ -63,6 +63,6 @@
 	<button label="購入" name="buy_btn" />
 	<button label="取り消し" name="cancel_btn" />
 	<text name="buy_currency">
-		約US$ [USD]でL$ [LINDENS]を購入
+		約[LOCALAMOUNT]でL$ [LINDENS]を購入
 	</text>
 </floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
index b6fc743abe08bb9d473dca893f5f8bffc582a281..6ee5cc5341ed8d55fe9bf078cc9b670f30ca890f 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est" left_delta="80">
-		voor ong. US$ [USD]
+		voor ong. [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Data ophalen…
@@ -63,6 +63,6 @@ Verhoog de hoeveelheid die gekocht moet worden.
 	<button label="Annuleren" name="cancel_btn"/>
 	<button label="Kopen" name="buy_btn"/>
 	<string name="buy_currency">
-		Koop L$ [LINDENS] voor ong. US$ [USD]
+		Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index b0b8935433c4e93392b0b666ff3f6e1d731c5706..5e5948288336fc65642a15675e70864871c7c770 100755
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est">
-		L$ za [USD]US$
+		za [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Otrzymywanie danych...
@@ -64,6 +64,6 @@ Proszę zwiększyć ilość.
 	<button label="Anuluj" name="cancel_btn" />
 	<button label="Kup" name="buy_btn" />
 	<string name="buy_currency">
-		Kup [LINDENS]L$ za [USD]US$
+		Kup [LINDENS]L$ za [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index ceeb070c4e47bd5da15e7d29a4af5bc3a2223c4f..aac8438fdcf3c5b03200ef8db1144083b6771568 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -29,7 +29,7 @@
 		1234
 	</line_editor>
 	<text name="currency_est" left_delta="72">
-		por aproxim. US$ [USD]
+		por aproxim. [LOCALAMOUNT]
 	</text>
 	<text name="getting_data">
 		Obtendo dados...
@@ -63,6 +63,6 @@ Aumente a quantidade de compra.
 	<button label="Fechar" name="cancel_btn"/>
 	<button label="Adquirir" name="buy_btn"/>
 	<string name="buy_currency">
-		Comprar L$ [LINDENS] por aproximadamente US$ [USD]
+		Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT]
 	</string>
 </floater>
diff --git a/indra/newview/tests/llmediadataclient_test.cpp b/indra/newview/tests/llmediadataclient_test.cpp
index 217889c39005fc151774b0d015d040571b041b02..6ff2c9446e72d723e340d38d7c03786314d93d98 100644
--- a/indra/newview/tests/llmediadataclient_test.cpp
+++ b/indra/newview/tests/llmediadataclient_test.cpp
@@ -191,6 +191,12 @@ class LLMediaDataClientObjectTest : public LLMediaDataClientObject
 	virtual bool isDead() const
 		{ return mDead; }
 
+	void setDistanceFromAvatar(F64 val)
+		{ mRep["distance"] = val; }
+	
+	void setTotalMediaInterest(F64 val)
+		{ mRep["interest"] = val; }
+
 	int getNumBounceBacks() const
 		{ return mNumBounceBacks; }
 	
@@ -593,6 +599,91 @@ namespace tut
 
 			ensure("queue empty", mdc->isEmpty());
 		}
-		
+		ensure("refcount of o1", o1->getNumRefs(), 1);
+		ensure("refcount of o2", o2->getNumRefs(), 1);
+		ensure("refcount of o3", o3->getNumRefs(), 1);
+		ensure("refcount of o4", o4->getNumRefs(), 1);
+
 	}
+	
+	//////////////////////////////////////////////////////////////////////////////////////////
+
+    template<> template<>
+    void mediadataclient_object_t::test<9>()
+    {
+		//
+		// Test queue re-ordering
+		//
+		LOG_TEST(9);
+		
+		LLMediaDataClientObject::ptr_t o1 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_1,"10.0","1.0"));
+		LLMediaDataClientObject::ptr_t o2 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_2,"20.0","1.0"));
+		LLMediaDataClientObject::ptr_t o3 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_3,"30.0","1.0"));
+		LLMediaDataClientObject::ptr_t o4 = new LLMediaDataClientObjectTest(_DATA(VALID_OBJECT_ID_4,"40.0","1.0"));
+		{
+			LLPointer<LLObjectMediaDataClient> mdc = new LLObjectMediaDataClient(NO_PERIOD,NO_PERIOD);
+			
+			// queue up all 4 objects.  They should now be in the queue in
+			// order 1 through 4, with 4 being at the front of the queue
+			mdc->fetchMedia(o1);
+			mdc->fetchMedia(o2);
+			mdc->fetchMedia(o3);
+			mdc->fetchMedia(o4);
+			
+			int test_num = 0;
+			
+			ensure(STR(test_num) + ". is in queue 1", mdc->isInQueue(o1));
+			ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2));
+			ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3));
+			ensure(STR(test_num) + ". is in queue 4", mdc->isInQueue(o4));
+			ensure(STR(test_num) + ". post records", gPostRecords->size(), 0);
+			
+			::pump_timers();
+			++test_num;
+			
+			// The first tick should remove the first one 
+			ensure(STR(test_num) + ". is not in queue 1", !mdc->isInQueue(o1));
+			ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2));
+			ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3));
+			ensure(STR(test_num) + ". is in queue 4", mdc->isInQueue(o4));
+			ensure(STR(test_num) + ". post records", gPostRecords->size(), 1);
+			
+			// Now, pretend that object 4 moved relative to the avatar such
+			// that it is now closest
+			static_cast<LLMediaDataClientObjectTest*>(
+				static_cast<LLMediaDataClientObject*>(o4))->setDistanceFromAvatar(5.0);
+			
+			::pump_timers();
+			++test_num;
+			
+			// The second tick should still pick off item 2, but then re-sort
+			// have picked off object 4
+			ensure(STR(test_num) + ". is in queue 2", mdc->isInQueue(o2));
+			ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3));
+			ensure(STR(test_num) + ". is not in queue 4", !mdc->isInQueue(o4));
+			ensure(STR(test_num) + ". post records", gPostRecords->size(), 2);
+
+			::pump_timers();
+			++test_num;
+			
+			// The third tick should pick off object 2
+			ensure(STR(test_num) + ". is not in queue 2", !mdc->isInQueue(o2));
+			ensure(STR(test_num) + ". is in queue 3", mdc->isInQueue(o3));
+			ensure(STR(test_num) + ". post records", gPostRecords->size(), 3);
+
+			// The fourth tick should pick off object 3
+			::pump_timers();
+			++test_num;
+
+			ensure(STR(test_num) + ". is not in queue 3", !mdc->isInQueue(o3));
+			ensure(STR(test_num) + ". post records", gPostRecords->size(), 4);
+
+			ensure("queue empty", mdc->isEmpty());
+		}
+		ensure("refcount of o1", o1->getNumRefs(), 1);
+		ensure("refcount of o2", o2->getNumRefs(), 1);
+		ensure("refcount of o3", o3->getNumRefs(), 1);
+		ensure("refcount of o4", o4->getNumRefs(), 1);
+    }
+	
 }
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 4193343d64f56fb499472a66db3bc735d9153171..413331548050ab27cb9cdd1bf335bee0d836b340 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -278,10 +278,12 @@ def construct(self):
 
             # Vivox runtimes
             self.path("SLVoice.exe")
-            self.path("alut.dll")
             self.path("vivoxsdk.dll")
             self.path("ortp.dll")
-            self.path("wrap_oal.dll")
+            self.path("libsndfile-1.dll")
+            self.path("zlib1.dll")
+            self.path("vivoxplatform.dll")
+            self.path("vivoxoal.dll")
 
             # For google-perftools tcmalloc allocator.
             try:
@@ -537,10 +539,11 @@ def construct(self):
                 self.path("zh-Hans.lproj")
 
                 # SLVoice and vivox lols
-                self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib")
-                self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib")
+                self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib")
+                self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")
                 self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
                 self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
+                self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")
                 self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
 
                 libdir = "../../libraries/universal-darwin/lib_release"
@@ -839,7 +842,10 @@ def construct(self):
                     self.end_prefix()
             if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
                     self.path("libortp.so")
+                    self.path("libsndfile.so.1")
+                    self.path("libvivoxoal.so.1")
                     self.path("libvivoxsdk.so")
+                    self.path("libvivoxplatform.so")
                     self.end_prefix("lib")
 
 class Linux_x86_64Manifest(LinuxManifest):
diff --git a/install.xml b/install.xml
index 1df8fd09f4b73ec65fc3ecfe33d5bf6008e5a5ba..3e49087726abc7b57d3b06f575d5a5250b12c17f 100644
--- a/install.xml
+++ b/install.xml
@@ -948,9 +948,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>b40a13847ee773c9ee06f641fe0dd1c2</string>
+            <string>7f818f13faf7c02838fe66f7d27e1913</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20091023.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-darwin-20091124.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
@@ -962,9 +962,9 @@ anguage Infrstructure (CLI) international standard</string>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>6f2f911545e5906edc87f4f3cda423a1</string>
+            <string>92cff05661b5547caae7cc6c66d09870</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091023.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-windows-20091123.tar.bz2</uri>
           </map>
         </map>
       </map>
@@ -1367,23 +1367,23 @@ anguage Infrstructure (CLI) international standard</string>
           <key>darwin</key>
           <map>
             <key>md5sum</key>
-            <string>8675b5eedef038b514338b17f0e55961</string>
+            <string>dd66471b31d369bb7bcbcc1a833d9070</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-darwin-20090309.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-darwin-20091126.tar.bz2</uri>
           </map>
           <key>linux</key>
           <map>
             <key>md5sum</key>
-            <string>01573510dce7f380f44e561ef2f3dd9f</string>
+            <string>e56745bc71fc22fc90f80cb359db7022</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-linux-20090309.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-linux-20091126.tar.bz2</uri>
           </map>
           <key>windows</key>
           <map>
             <key>md5sum</key>
-            <string>752daa90e07c05202d1f76980cb955eb</string>
+            <string>3081bcc821cdc016aa4127cb026e4311</string>
             <key>url</key>
-            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-2.1.3010.6270-windows-20090309.tar.bz2</uri>
+            <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.0.0006.7653-windows-20091126.tar.bz2</uri>
           </map>
         </map>
       </map>